簡體   English   中英

使用Array.includes一鍵檢查數組是否包含對象

[英]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 ,也可以利用適當的數據結構。

數組#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM