如何从JavaScript中的“Set”对象获取单个键值?

6

我有一个Set()对象,其中包含三个键值对

var myset =new Set();
myset.add('first','This is first value');
myset.add('second','This is second value');
myset.add('third','This is third value');

使用循环,我可以获得这三个键的值。

for( var value of myset){
  console.log(value);
}

如何获取单个值?我想要获取值的第二个键?是否有任何选项?我已经尝试了这些方法但没有成功。
myset.get('second');
myset(1);

var myset = new Set();
myset.add('first', 'This is first value');
myset.add('second', 'This is second value');
myset.add('third', 'This is third value');

//   Using loop I can got value of these three key

for (var value of myset) {
  console.log(value);
}

// How can get individual value? I want to get second key of value?

// I have tried these but not working

myset.get('second');
myset(1);


这里什么也没有吗?https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set - mplungjan
3
Set.add 只接受一个参数。 - Hikmat G.
2
你需要的是 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map - Hikmat G.
4个回答

7
Set是一组值的集合,而不是它们的映射,因此add接受一个参数,即一个值。你要找的东西是Map
按索引获取值的方法在这个答案中有解释,对于SetMap都是相同的。需要迭代集合直到达到索引位置。可以通过先将其转换为数组来实现,但效率较低:

const map = new Map();
map.set('first','This is first value');
map.set('second','This is second value');
map.set('third','This is third value');

console.log(map.get('second') === 'This is second value'); // true
console.log([...map.values()][1] === 'This is second value'); // true


NB: [...map.values()][1] 是一种访问 Map 中插入的第二个元素的方式,但这仅因为在 Javascript 中是这样实现的。在 JS 和其他语言中,Map 和类似 Map 的数据结构(如 Object)不保证插入顺序。 - BrDaHa
@BrDaHa 实际上,ES6 Map 保证顺序,这是它与对象字面量不同的方式,除了非字符串键之外。不能确定其他语言是否如此。 - Estus Flask
是的,我提到了那个 :) - BrDaHa
2
@BrDaHa 我的观点是这不仅仅是一种实现,这种行为是严格规定的。另一方面,所有现代引擎都实现了对象字面量以保持顺序,但规范并不保证这一点。 - Estus Flask
1
我不知道它在规范中,这很好。我只是告诫用户不要依赖它作为其他编程语言中哈希集合数据结构的一致属性。 - BrDaHa

2

Javascript中的Set.add()只接受一个参数。因此,第二个参数总是被忽略,而且由于这是JS,它不会抛出任何错误。您可以使用简单的JS对象来实现您想要的效果。

var x = {}
x[key1] = value1
x[key2] = value2

然后你可以像这样获取值:

x[key1] # will output value1

1
您正在错误地使用Set。它不是一个键/值存储,而是一个唯一值列表。

源代码

您的代码...

var myset =new Set();
myset.add('first','This is first value');
myset.add('second','This is second value');
myset.add('third','This is third value');

我真正希望的是创建一个具有值"first", "second", "third"的集合(由于Set.prototype.add()只接受一个参数,因此第二个参数将被忽略)。

对于通用键/值存储,您应该使用Map或常规JavaScript对象(取决于您支持的环境)。

Map

Map允许您存储键/值对,其中键可以是任何类型。这与常规JS对象不同,后者的键必须为字符串类型。

const myMap = new Map();
myMap.set('key', 'value');

普通JS对象

您可以使用普通的JS对象,因为您的键是字符串,最好使用null原型,可以通过Object.create(null)获得(null原型确保您不会在原型链上读取任何其他值,而无需进行Object.prototype.hasOwnProperty()检查)。


这个答案应该建议使用Map语法。 - BrDaHa
@BrDaHa 更新了 - 你是否建议始终使用 Map,即使键是字符串,就像 OP 的示例一样? - alex
是的,对于像OP这样的用法(在访问和迭代方面),通常更具性能和直观性,但在序列化方面可能略逊一筹。 - BrDaHa

0

Set.add只接受一个参数。你可以做的是,插入JSON对象,如下所示:

var myset = new Set();
myset.add({'first' : 'This is first value'});
myset.add({'second': 'This is second value'});
myset.add({'third':'This is third value'});

var val = [...myset].filter(x => x.hasOwnProperty('first'))[0]['first'];
console.log(val)


如果你使用 (null) 创建一个对象,你可能不必测试 ownproperty。 - mplungjan
是的,这种验证显然必须存在。我已经尝试根据 OP 代码回答(正测试例)。 - Hardik Shah
1
这是错误的使用 Set 的方式。如果您添加第四行与第三行完全相同,则仍将在 Set 中有 4 个唯一元素,因为 {'third': 'This is third value'} !== {'third': 'This is third value'} - BrDaHa

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