如何向 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)

附言: 我知道两者都不起作用

137149 次浏览

@ Fuzzyma ,我建议您使用 JavaScript 的 原型机预备上定义新的方法。

不要使用在 预备上定义的内置方法名。

如果您仍然希望使用与内置函数名(如 add)相同的函数名,那么更好的方法是继承 预备并重写 add()方法。

这是向现有对象添加方法而不影响它们的方法和使用我们自己的同名方法的更好方法。方法重写的魅力,一个不错的面向对象概念。

在下面的代码中,我已经在 预备上定义了 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 }

把这个贴在这里,寻找灵感。 创建一个扩展 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]);

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

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


// alternative, without anonymous arrow function
array.forEach(mySet.add, mySet)

目前还没有用于 Set 的 addAll方法,但是您有两个选项来简化使用它们时的生活。第一个是扩展原型。在此之前,先看看 读读这篇文章,然后再决定可能的后果是否适合您的项目/预期用途。

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;
}

这里有一个功能性的方法,返回一个新的集合:

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' }

你也可以使用 Array.reduce():

const mySet = new Set();
mySet.add(42); // Just to illustrate that an existing Set is used


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

这是我见过最优雅的

// 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);

创建一个新集合:

    //Existing Set
let mySet = new Set([1,2,3,4,5]);
//Existing Array
let array = [6,7,8,9,0];
        

mySet = new Set(array.concat([...mySet]));
console.log([...mySet]);
    

//or single line
console.log([...new Set([6,7,8,9,0].concat([...new Set([1,2,3,4,5])]))]);

使用扩展运算符轻松地将新数组项混合到现有集合中如何?

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

JSFIDDLE

在创建集合时,首先输入数组。 您将获得包含数组中所有项的集合。

const array = [1,2,3,4,5]
let mySet = new Set(array)
console.log(mySet)
//Add new one element
mySet.add(6)
console.log(mySet)


//Add exist element
mySet.add(6)
console.log(mySet)
let mySet = new Set(['a', 'b']);
let arrayToBeAdded = ['c', 'd'];


//convert the Set to an array, then concatenate both arrays, finally convert into a Set
mySet = Array.form(mySet).concat(arrayToBeAdded);
mySet = new Set(mySet);


//in single line
mySet = new Set(Array.form(mySet).concat(arrayToBeAdded));