简体   繁体   English

使用Array.includes一键检查数组是否包含对象

[英]Check an array contains an object using one key with Array.includes

I have an Array, like this one: 我有一个像这样的数组:

let myarr = [
  {type:"a", class:"x", value:"p"},
  {type:"b", class:"x", value:"r"},
  {type:"a", class:"y", value:"p"}
];

I need to use Array.includes to check whether an object with class=y is in this array. 我需要使用Array.includes来检查是否有class=y的对象在此数组中。

I need to check it with myarr.includes({condition}); 我需要使用myarr.includes({condition});进行检查myarr.includes({condition});

I could simply compare the whole object but I don't know how to use a key of the object to check. 我可以简单地比较整个对象,但不知道如何使用对象的键进行检查。

To do this you can use the some() method. 为此,您可以使用some()方法。

The some() method tests whether at least one element in the array passes the test implemented by the provided function. 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 relies on identity checks which requires you to pass in the same object (not just an object with the same properties, it needs the same reference such that objA === objB ). Array.prototype.includes依赖于身份检查,该检查要求您传入相同的对象(不仅仅是具有相同属性的对象,它还需要相同的引用,例如objA === objB )。 You want a function that allows you to provide a function in which you can check the condition. 您需要一个功能,该功能允许您提供可以检查条件的功能。 Fortunately there is Array.prototype.some for this ask. 幸运的是,这里有Array.prototype.some

myarr.some(item => item.class === 'y')

You may either use Array#some or you may also take advantage of using proper data structures. 您可以使用Array#some ,也可以利用适当的数据结构。

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 instead of Array 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) 

Specialized Map 专业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) 

Array + Set 数组+集

 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!') } 

Try this simple solution. 试试这个简单的解决方案。

 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";})) 

You could use Array.prototype.includes() or String.prototype.includes() but is not practical, and is not useful as a general solution in this case, see this: 您可以使用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) 

That is why using Some() , as other users said, is the better choice. 这就是为什么使用其他用户所说的Some()是更好的选择的原因。

I use lodash .includes() or .has() methods for things like that: 我将lodash的.includes()或.has()方法用于诸如此类的事情:

_.includes({ 'a': 1, 'b': 2 }, 1);

https://lodash.com/docs/4.17.10#includes https://lodash.com/docs/4.17.10#includes

You can also do this with a plain js map, some or other methods. 您也可以使用普通的js映射,某些或其他方法来执行此操作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM