[英]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
,也可以利用适当的数据结构。
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)
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)
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.