不能使用从 MongoDb 读取的地图

问题描述 投票:0回答:1

我写了一个在 MongoDb 中存储 Map 对象的函数。但是,当我在别处读回该对象时,如:

var map=this.projectData.storedMap;
map.forEach ...

它声明 map.forEeach 不是一个函数。我尝试让 x=new Map() 并分配对象,但结果仍然相同。

我使用 map 是因为我需要确保属性的特定顺序(已排序)。

javascript mongodb meteor
1个回答
1
投票

Meteor 通过 EJSON 支持复杂的自定义数据类型:https://docs.meteor.com/api/ejson.html

每次插入都会尝试解析已注册 EJSON 扩展的复杂对象!不过有一件事,它需要猴子修补 Map 类。 下面的代码为 Map 定义了一个自定义的 EJSON 类型:

import { EJSON } from 'meteor/ejson'

Map.prototype.toJSONValue = function () {
  const self = this
  return [...self.entries()]
}

Map.prototype.typeName = function () {
  return 'Map';
}

EJSON.addType('Map', function fromJSONValue(entries) {
  return new Map(entries)
})

这个例子表明,即使在再次设置值之后,键的顺序也会被保留:

const map = new Map()

map.set('foo', 1)
map.set('bar', 3)
map.set('baz', 5)
map.set('moo', 7)
map.set('foo', 11) // set again

const dataStr = EJSON.stringify({ data: map })

// {"data":{"$type":"Map","$value":[["foo",11],["bar",3],["baz",5],["moo",7]]}}

EJSON.parse(dataStr)
// { data: Map(4) { 'foo' => 11, 'bar' => 3, 'baz' => 5, 'moo' => 7 } }

这里重要的是使用

map.entries()
返回保留插入顺序的迭代器,参见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/entries

© www.soinside.com 2019 - 2024. All rights reserved.