最简单的方法来合并ES6地图/集?

有没有简单的方法来合并ES6地图(如Object.assign )? 而我们在这里,ES6集(如Array.concat )呢?

对于套件:

 var merged = new Set([...set1, ...set2, ...set3]) 

对于地图:

 var merged = new Map([...map1, ...map2, ...map3]) 

请注意,如果多个地图具有相同的键,则合并地图的值将是具有该键的最后一个合并地图的值。

这是我使用生成器的解决scheme:

对于地图:

 let map1 = new Map(), map2 = new Map(); map1.set('a', 'foo'); map1.set('b', 'bar'); map2.set('b', 'baz'); map2.set('c', 'bazz'); let map3 = new Map(function*() { yield* map1; yield* map2; }()); console.log(Array.from(map3)); // Result: [ [ 'a', 'foo' ], [ 'b', 'baz' ], [ 'c', 'bazz' ] ] 

对于集合:

 let set1 = new Set(['foo', 'bar']), set2 = new Set(['bar', 'baz']); let set3 = new Set(function*() { yield* set1; yield* set2; }()); console.log(Array.from(set3)); // Result: [ 'foo', 'bar', 'baz' ] 

由于我不明白的原因,你不能直接将一个Set的内容添加到另一个内置操作。

.add()似乎很自然的发现你传递了另一个Set对象,然后从Set中获取所有的项目(这是我自己的Set对象 -之前有一个ES6 Set规范)。 但是,他们select不这样实施。

相反,您可以使用一个.forEach()行来完成此操作:

 var s = new Set([1,2,3]); var t = new Set([4,5,6]); t.forEach(s.add, s); console.log(s); // 1,2,3,4,5,6 

而且,对于一个Map ,你可以这样做:

 var s = new Map([["key1", 1], ["key2", 2]]); var t = new Map([["key3", 3], ["key4", 4]]); t.forEach(function(value, key) { s.set(key, value); }); 

要合并数组中的集合,你可以这样做

 var Sets = [set1, set2, set3]; var merged = new Set([].concat(...Sets.map(set => Array.from(set)))); 

对于我来说,至less在巴比尔,为什么下面这个应该是等同的,至less是失败的:

 var merged = new Set([].concat(...Sets.map(Array.from))); 

不,这些操作没有内置的操作,但你可以很容易地创build自己的操作:

 Map.prototype.assign = function(...maps) { for (const m of maps) for (const kv of m) this.add(...kv); return this; }; Set.prototype.concat = function(...sets) { const c = this.constructor; let res = new (c[Symbol.species] || c)(); for (const set of [this, ...sets]) for (const v of set) res.add(v); return res; }; 

批准的答案很好,但每次都会创build一个新的集合。

如果您想要改变现有的对象,请使用助手函数。

 function concatSets(set, ...iterables) { for (const iterable of iterables) { for (const item of iterable) { set.add(item); } } } 

用法:

 const setA = new Set([1, 2, 3]); const setB = new Set([4, 5, 6]); const setC = new Set([7, 8, 9]); concatSets(setA, setB, setC); // setA will have items 1, 2, 3, 4, 5, 6, 7, 8, 9 

地图

 function concatMaps(map, ...iterables) { for (const iterable of iterables) { for (const item of iterable) { map.set(...item); } } } 

用法:

 const mapA = new Map().set('S', 1).set('P', 2); const mapB = new Map().set('Q', 3).set('R', 4); concatMaps(mapA, mapB); // mapA will have items ['S', 1], ['P', 2], ['Q', 3], ['R', 4]