[英]Check an array contains an object using one key with Array.includes
我有一個像這樣的數組:
let myarr = [
{type:"a", class:"x", value:"p"},
{type:"b", class:"x", value:"r"},
{type:"a", class:"y", value:"p"}
];
我需要使用Array.includes
來檢查是否有class=y
的對象在此數組中。
我需要使用myarr.includes({condition});
進行檢查myarr.includes({condition});
我可以簡單地比較整個對象,但不知道如何使用對象的鍵進行檢查。
為此,您可以使用some()
方法。
some()方法測試數組中的至少一個元素是否通過了由提供的函數實現的測試。
let myarr = [ {type: "a",class: "x",value: "p"}, {type: "b",class: "x",value: "r"}, {type: "a",class: "y",value: "p"} ]; let pass = myarr.some(item => item.class == 'y'); let fail = myarr.some(item => item.class == 'z'); console.log(pass); console.log(fail);
Array.prototype.includes
依賴於身份檢查,該檢查要求您傳入相同的對象(不僅僅是具有相同屬性的對象,它還需要相同的引用,例如objA === objB
)。 您需要一個功能,該功能允許您提供可以檢查條件的功能。 幸運的是,這里有Array.prototype.some
。
myarr.some(item => item.class === 'y')
您可以使用Array#some
,也可以利用適當的數據結構。
const myArr = [{ type: "a", class: "x", value: "p" }, { type: "b", class: "x", value: "r" }, { type: "a", class: "y", value: "p" } ] const hasClassY = myArr.some (o => o.class == 'y') console.log (hasClassY)
Map
而不是Array
const classMap = new Map([ ['x', [{ type: "a", class: "x", value: "p", }, { type: "b", class: "x", value: "r" }]], ['y', [{ type: "a", class: "y", value: "p" }]] ]) if (classMap.has('y')) { // Do stuff here } const itemsWithYClass = classMap.get('y') const itemsWithXClass = classMap.get('x') const flatten = xs => [...xs].reduce((r, el) => [...r, ...el]) const allItems = flatten(classMap.values()) console.log('Y class: ', itemsWithYClass) console.log('X class: ', itemsWithXClass) console.log('All: ', allItems)
Map
class SpecializedMap extends Map { get[Symbol.species]() { return Map } getAll() { return [...this.values()].reduce((r, el) => [...r, ...el]) } } const classMap = new SpecializedMap([ ['x', [{ type: "a", class: "x", value: "p", }, { type: "b", class: "x", value: "r" }]], ['y', [{ type: "a", class: "y", value: "p" }]] ]) if (classMap.has('y')) { // Do stuff here } const itemsWithYClass = classMap.get('y') const itemsWithXClass = classMap.get('x') const allItems = classMap.getAll() console.log('Y class: ', itemsWithYClass) console.log('X class: ', itemsWithXClass) console.log('All: ', allItems)
const myArr = [{ type: "a", class: "x", value: "p" }, { type: "b", class: "x", value: "r" }, { type: "a", class: "y", value: "p" } ] // This set contains all unique classes within myArr // The challenge is you need to sync myArr with classSet // so classSet contains the actual classes within myArr. const classSet = new Set(['x', 'y']) // Somewhere in your code you import classSet and... if (classSet.has('y')) { console.log('Do stuff here!') }
試試這個簡單的解決方案。
let myarr = [ {type:"a", class:"x", value:"p"}, {type:"b", class:"x", value:"r"}, {type:"a", class:"y", value:"p"} ]; console.log(myarr.some(function(element){return element["class"] === "x";}))
您可以使用Array.prototype.includes()或String.prototype.includes(),但不實際,在這種情況下不能用作常規解決方案,請參見:
let myarr = [ {type:"a", class:"x", value:"p"}, {type:"b", class:"x", value:"r"}, {type:"a", class:"y", value:"p"} ]; //String.includes - We need the exact match, this could lead to error var value1 = JSON.stringify(myarr).includes('"class":"x"'); //Array.includes - It's ok, but it has two iterations, not one as some() var value2 = myarr.map(o=>o.class).includes("x") console.log(value1) console.log(value2)
這就是為什么使用其他用戶所說的Some()
是更好的選擇的原因。
我將lodash的.includes()或.has()方法用於諸如此類的事情:
_.includes({ 'a': 1, 'b': 2 }, 1);
https://lodash.com/docs/4.17.10#includes
您也可以使用普通的js映射,某些或其他方法來執行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.