如何将值数组添加到Set

时间:2018-06-15 19:10:22

标签: javascript set

将数组的所有值添加到Set中的旧学校方法是:

// for the sake of this example imagine this set was created somewhere else 
// and I cannot construct a new one out of an array
let mySet = new Set()

for(let item of array) {
  mySet.add(item)
}

有更优雅的方式吗?可能是mySet.add(array)mySet.add(...array)

PS:我知道两个都不起作用

9 个答案:

答案 0 :(得分:5)

虽然Set API仍然非常简约,但您可以使用Array.prototype.forEach并稍微缩短您的代码:

array.forEach(item => mySet.add(item))

答案 1 :(得分:4)

这是IMO最优雅的

// for a new Set 
const x = new Set([1,2,3,4]);

// for an existing Set
const y = new Set();

[1,2,3,4].forEach(y.add, y);

答案 2 :(得分:3)

如何使用价差运算符轻松地将新数组项融合到现有集中?

const mySet = new Set([1,2,3,4])
const additionalSet = [5,6,7,8,9]
mySet = new Set([...mySet, ...additionalSet])

JSFIDDLE

答案 3 :(得分:2)

您也可以使用Array.reduce()

const mySet = new Set();
mySet.add(42);

[1, 2, 3].reduce((s, e) => s.add(e), mySet);

答案 4 :(得分:1)

只需在此处发贴灵感.. 创建一个扩展Set的类,并添加一个addRange方法。



    class MegaSet extends Set {
    
      constructor(iterable) {
       super(iterable);
      }
      
      addRange(range) {
        for (var elem of range) {
          this.add(elem);
        }
      }
    }
    
    const array = [1,2,3,5,5,6];
    let mySet = new MegaSet([1,2,3,4]);
    
    mySet.addRange(array);
    console.log([...mySet]);




答案 5 :(得分:0)

@Fuzzyma ,我建议您使用JavaScript的原型设计来定义设置的新方法。

  

请勿使用设置上定义的内置方法名称。

     

如果您仍然希望使用与内置函数名称相同的函数名称,例如add,那么更好的方法是继承 Set 并覆盖add()方法。

     

这是向现有对象添加方法而不影响其方法并使用我们自己的同名方法的更好方法。 方法覆盖的魅力,一个不错的OOP概念。

在下面的代码中,我在设置上定义了addItems()

  

http://rextester.com/LGPQC98007在线试用。

var arr = [3, 7, 8, 75, 65, 32, 98, 32, 3];
var array = [100, 3, 200, 98, 65, 300]; 

// Create a Set
var mySet = new Set(arr);
console.log(mySet);

// Adding items of array to mySet
Set.prototype.addItems = function(array) {
    for(var item of array){
        this.add(item)
    }
}

mySet.addItems(array);
console.log(mySet)

»输出

Set { 3, 7, 8, 75, 65, 32, 98 }
Set { 3, 7, 8, 75, 65, 32, 98, 100, 200, 300 }

答案 6 :(得分:0)

目前套装没有addAll方法,但您可以使用两种方法来简化使用它们的生活。第一个是扩展原型。在此之前,read this post然后决定可能的后果是否适合您的项目/预期用途。

if (!Set.prototype.addAll) {
  Set.prototype.addAll = function(items) {
    if (!Array.isArray(items)) throw new TypeError('passed item is not an array');
    // or (not sure what the real Set.prototype will get sometime)
    // if (!Array.isArray(items)) items = [items];
    for (let it of items) {
      this.add(it);
    }
    return this;
  }
}

如果您决定不扩展原型,只需创建一个可以在项目中重复使用的函数

function addAll(_set, items) {
    // check set and items
    for (let it of items) {
         _set.add(it);
    }
    return _set;
}

答案 7 :(得分:0)

这是一种实用的方法,它返回一个新集合:

const set = new Set(['a', 'b', 'c'])
const arr = ['d', 'e', 'f']
const extendedSet = new Set([ ...set, ...arr ])
// Set { 'a', 'b', 'c', 'd', 'e', 'f' }

答案 8 :(得分:0)

创建一个新的集:

const x = new Set([1,2,3,4].concat([...ExistingSet]));