如何将值数组添加到集合中

223

将数组中所有值加入 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:我知道两者都不行


26
Set.prototype.addAll有一个一阶段的提案,详情请见Set.prototype.addAll - Yury Tarabanko
1
@YuryTarabanko 这有点奇怪,为什么一开始没有将其包含在Set#add中。肯定有人认为Array#push接受多个参数是不好的。 - Robert
1
你不能使用Set构造函数吗?请参考https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set#Relation_with_Array_objects。 - TrueWill
3
当我们使用arr.push(...items)时,为什么还需要使用set.add(value)呢?我最近遇到了这个问题,API设计不太好。 - Sainath S.R
11个回答

-4

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

不要使用在 Set 上已定义的内置方法名称。

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

这是向现有对象添加方法而不影响其方法并使用我们自己的具有相同名称的方法的更好方式。 这是一个很好的OOP概念,即方法重写魅力所在。

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

显然你没有读代码中的注释,我在那里声明了集合是在其他地方创建的,而且我不能创建一个新的。 - Fuzzyma
好的,我的意思是你已经创建了一个“Set”,并且想要将任何值的所有值添加到其中?让我更新我的代码并告诉你。谢谢提醒我犯的错误。 - hygull
@Fuzzyma,我认为你应该使用JavaScript的原型功能来定义一个Set方法。确保不要使用Set已定义的内置方法名称。我已经在我的答案中更新了一个小例子,请检查并告诉我你的建议。 - hygull
3
您可能想看一下 为什么扩展原生对象是不好的实践?。此外,如果您使用更少的格式化,您的答案(和评论)会更易读。最后,Stack Overflow有一个名为 Stack Snippets 的功能。在编辑器中,您可以单击带有尖括号 (<>) 的按钮,并将您的 JavaScript 代码粘贴到其中。这将使其他人能够运行它。 - Heretic Monkey
@Mike,我已经在我的代码中提到了这一点,尽管我没有使用它。实际上,我正在使用手机,所以无法在这里看到JS编辑器。谢谢。 - hygull

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接