从Set中的对象中提取属性值?

时间:2018-02-07 15:26:10

标签: javascript typescript ecmascript-6

对于该示例,SomeItem是对象的模型(将被建模为Typescript中的接口,或者您可以想象如果我们在,则存在SomeItem形式的项目无用的土地。

说我有SetmySet = new Set([{item: SomeItem, selected: true}, ...])

我想检查是否选择itemA: SomeItem

最干净的方法是什么?

这不起作用:

const isSelected = mySet.has({item: itemA, selected: true});

也没有这样做:

const isSelected = Array.from(mySet).includes({item: itemA, selected: true});

我假设上面两个没有用,因为它试图通过引用而不是值来比较对象。

这确实有效:

let isSelected: boolean;
mySet.forEach(state => {
  if (state.item === itemA) {
    isSelected = state.selected;
  }
});

但我的直觉告诉我有一个正确的方法来做到这一点。

所以, 如何在Set?

中提取对象属性的值

2 个答案:

答案 0 :(得分:2)

比较具有相同属性的两个对象只有在它们具有相同的引用时才返回true,我建议比较它们的属性,因为属性是原始值。

如果集合包含特定对象

,则可以使用某些方法过滤数组

let mySet = new Set([{item: 'SomeItem', selected: true}]);
let itemA = "SomeItem";
let isSelected =  Array.from(mySet).some(element => element.item === itemA);
console.log(isSelected);

答案 1 :(得分:2)

让我们以这种方式看一看,Set s主要返回一个可迭代的。当然,它们按顺序进行了整理,就像Map一样,但从数据结构的外观来看,Map会让您受益匪浅。

const x = new Set([
    { "foo": 1, selected: true },
    { "bar": 1, selected: false },
    { "baz": 1, selected: false },
    { "barf": 1, selected: false },
]);

现在,为了得到你想要的东西,你需要像你一样,使用Array.from(或[...x]传播它)转换为数组并迭代,找到它们的关键。< / p>

现在,作为地图:

const y = new Map();
y.set("foo", { selected: true });
y.set("bar", { selected: false });
y.set("baz", { selected: false });
y.set("barf", { selected: false });

通过这个,您只需稍微更改结构以给出item1或任何使用Map键的内容,并设置您想要的任何元素。

y.has("foo"); // true
y.get("foo").selected; //true

因此,如果你想在这里,抓住可迭代的密钥名称并获得哪个Map索引具有你想要的属性会更容易