[英]Extract value of property from object in a Set?
例如, SomeItem
是對象的模型(在Typescript中將被建模為接口,或者如果我們在無類型的土地上,您可以想象有一個項目具有SomeItem
形式。
假設我有一個Set
: mySet = 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;
}
});
但是我的直覺告訴我,有一種正確的方法可以做到這一點。
那么, 如何提取集合中對象的屬性值?
比較具有相同屬性的兩個對象僅在它們具有相同的引用時才返回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);
讓我們以這種方式看一下, Set
主要返回一個可迭代的。 當然,它們按順序進行哈希處理,就像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]
傳播它)將其轉換為數組並進行迭代,找到它們的鍵一樣。
現在,作為地圖:
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索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.