我有一系列项目:var treeItems = [];
。 treeItems.length
可能是5-30(可能是50),但每个treeItem
都是非常大的对象。我应该做两件事:迭代项目&按ID获取项目。
我正在考虑用es6 Map
替换数组。并迭代使用地图:Array.from(treeItemsMap.values())
操作。
问题 Array.from(map.values())
操作的成本(时间/内存)是多少?
P.S。我正在为移动设备做SPA,因此内存使用也很重要。
答案 0 :(得分:5)
spec说:
必须使用哈希表或其他方法实现Map对象 平均而言,提供次线性访问时间的机制 关于集合中元素的数量。
具体费用取决于实施。
使用Array.from
只会将数据复制到数组中,这会无用地浪费内存。更好地迭代地图。
注意50项是非常小的数据。我认为地图中的巨大物体并不重要。记住JS是一种按值传递的语言,但是对于对象,该值是一个引用。因此,地图将只包含50个对象的引用,这些引用将单独存储。迭代或访问这个小地图应该不会花费太多。
答案 1 :(得分:1)
使用 .map()迭代器进行处理。
我们可以对Maps使用一个简单的技巧,因为对于Maps,没有诸如map()这样的操作。 由Dr. Axel Rauschmayer建议: *将地图转换成[键,值]对数组。 *映射或过滤数组。 *将结果转换回地图。
示例:
let map0 = new Map([
["a", 1],
["b", 2],
["c", 3]
]);
const map1 = new Map(
[...map0]
.map(([k, v]) => ['_' + k, v * 2])
);
产生
{'_a' => 2, '_b' => 4, '_c' => 6}
答案 2 :(得分:0)
与 for(){...} 操作者进行交流。
我们可以像这样迭代ES6 Map:
let map0 = new Map([
["a", 1],
["b", 2],
["c", 3]
]);
let map1 = new Map();
for (let [key, value] of map0) {
map1.set('_' + k, v * 2);
}
产生
{'_a' => 2, '_b' => 4, '_c' => 6}