ES6地图迭代成本

时间:2015-09-22 15:23:55

标签: javascript dictionary ecmascript-6

我有一系列项目:var treeItems = [];treeItems.length可能是5-30(可能是50),但每个treeItem都是非常大的对象。我应该做两件事:迭代项目&按ID获取项目。

我正在考虑用es6 Map替换数组。并迭代使用地图:Array.from(treeItemsMap.values())操作。

问题 Array.from(map.values())操作的成本(时间/内存)是多少?

P.S。我正在为移动设备做SPA,因此内存使用也很重要。

3 个答案:

答案 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}