2015-04-21 19 views
3

是否有一种简单的方法来验证ES6集包含的值是特定的数组?我想不需要我使用一个参考的解决方案:在ES6中存储数组按照值设置和访问

var set = new Set(); 

var array = [1, 2]; 
set.add(array); 
set.has(array); // true 

set.add([3, 4]); 
set.has([3, 4]); // false 

到目前为止,我的解决方案是将一切存储为一个字符串,但是这很烦人:

set.add([3, 4].toString()); 
set.has([3, 4].toString()); // true 
+0

这似乎增加文字阵列有差别,例如:http://jsfiddle.net/BloodyKnuckles/hm0b9j76/​​1/ – bloodyKnuckles

+1

而不是使用'.toString',我推荐'JSON.stringify()'。 – Bergi

回答

9

不存在不是。

A Set适用于对象和基元,对于防止相同的基元和重新添加同一对象实例很有用。

每个数组都是它们自己的对象,所以实际上可以使用相同的值添加两个不同的数组。

var set = new Set(); 
set.add([3, 4]); 
set.add([3, 4]); 
console.log(set.size);//2 

另外,没有什么可以防止对象在一组中被更改一次。

var set = new Set(); 
var a1 = [3, 4]; 
var a2 = [3, 4]; 
set.add(a1); 
set.add(a2); 
a2.push(5); 
for (let a of set) { 
    console.log(a); 
} 
//Outputs: 
// [3, 4] 
// [3, 4, 5] 

一套does not have a mechanism用于检查集合中的对象的值。由于对象的价值随时可能发生变化,因此它不会比简单地循环它们更有效。

您正在查看的功能已在各种ECMAScript提案中被踢出,但它似乎不会很快到来。

+1

这似乎破坏了我期望的很多功能......例如,使用有序对或使用包含其他集的集合。我最初的计划是实现一种找到两组笛卡尔积的方法,但看起来我必须将有序对存储为我可以唯一标识的东西。 – djfdev

1

显然,它看起来不像set.has()将检查这样的数组元素。然而,他们被添加,:

var set = new Set([1, 2]); 
set.add([3, 4]); 
console.log(Array.from(set));