我写了一个在 MongoDb 中存储 Map 对象的函数。但是,当我在别处读回该对象时,如:
var map=this.projectData.storedMap;
map.forEach ...
它声明 map.forEeach 不是一个函数。我尝试让 x=new Map() 并分配对象,但结果仍然相同。
我使用 map 是因为我需要确保属性的特定顺序(已排序)。
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