繁体   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