要设置的JavaScript数组


144

MSDN引用了JavaScript的Set集合抽象。我有一个要转换为集合的对象数组,以便能够.delete()按名称删除()各种元素:

var array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

如何将此数组转换为集合?更具体地说,是否可以在不迭代上述数组的情况下执行此操作?相对缺少文档(对于实例化集足够;对于转换,则足够)(如果可能的话)。

我可能还在考虑转换为Map,以通过密钥将其删除。我试图实现的是一个可迭代的集合,可以通过主要通过键(而不是索引)来访问元素来访问或修改该集合。

从数组到另一个的转换是最终目标。


1
听起来像是一个普通的旧物件将为您工作...
dandavis

3
@托马斯:所以我想念一些我想学的东西。var s = new Set(),添加对象并发出s.delete(whatever)-和var o = {1:'aaa',2:'bbbb'...}并发出delete(o [ '1'])?
Veverke'3

1
@Veverke比您的初始评论(+1)更具描述性。谢谢。但是,又有可能做到这一点,而无需遍历数组以将数组的内容添加到对象并保留诸如键可访问结构之类的列表?听起来您有个主意。如果您有时间详细说明,我不介意以答案格式查看它。
托马斯

2
该数组对象无效,因为{"bob", "dole"}它不是有效的对象。
Alnitak

1
@Veverke ES6 SetMap是“纯粹”的执行这些数据结构是不吃亏的问题,一个的Object当事情被添加到它的原型可以。
Alnitak

Answers:


203

只需将数组传递给Set构造函数即可。Set构造函数接受一个iterable参数。Array对象实现了iterable协议,因此它是有效参数。

var arr = [55, 44, 65];
var set = new Set(arr);
console.log(set.size === arr.length);
console.log(set.has(65));

看这里


完全正确,尽管我一直不愿意自己添加一个答案,因为OP的数据格式不正确,因此不清楚他的期望是什么
Alnitak

10
这不适用于IE11。它不支持此构造函数。除非您知道您的用户将要使用哪些浏览器,否则我会避免这样做。
艾瑞克(Eric)

10

如果您开始使用:

let array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

您需要一组名称,例如:

let namesSet = new Set(array.map(item => item.name));

3

什么利维 说,关于它传递到构造是正确的,但你也可以使用一个对象。

我认为Veverke想要说的是,您可以轻松地在对象上使用delete关键字来达到相同的效果。

我认为您对术语感到困惑;属性是对象的组成部分,您可以将其用作命名索引(如果要这样考虑的话)。

尝试这样的事情:

var obj = {
    "bob": "dole",
    "mr.": "peabody",
    "darkwing": "duck"
};

然后,您可以这样做:

delete obj["bob"];

对象的结构将是这样的:

{
    "mr.": "peabody",
    "darkwing": "duck"
}

具有相同的效果。


1
谢谢Astro :-)。确实,这提出了一个问题:“ Set对象和普通对象之间有什么区别?”?虽然,正如我在上面的评论中所指出的那样,“设置”是一种包装类型,提供了“清晰”的“很好的功能”。
Veverke'3

简而言之,我认为该帖子的标题应更改为“ Set对象和javascript中的普通对象之间有什么区别”,并注意“为了实现这一目标,我最终问自己” ...
Veverke

@Veverke“ Set对象和普通对象之间的区别是什么”,可以只阅读文档..
Hacketo

1
@Hacketo:除了Set在其api中提供“ Clear”外,您是否找到其他东西?
Veverke'3

1
这是一个有趣的答案-认为它可以提供比收到的更多的信用。让我思考。谢谢!
托马斯

2

按照定义,“集合是值的集合,其中每个值只能出现一次。” 因此,如果数组具有重复值,则重复值中只有一个值将被添加到您的Set中。

var arr = [1, 2, 3];
var set = new Set(arr);
console.log(set); // {1,2,3}


var arr = [1, 2, 1];
var set = new Set(arr);
console.log(set); // {1,2}

因此,如果数组中有重复的值,请不要转换为set。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.