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.
I need to check it with myarr.includes({condition});
I could simply pare the whole object but I don't know how to use a key of the object to check.
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.
I need to check it with myarr.includes({condition});
I could simply pare the whole object but I don't know how to use a key of the object to check.
Share Improve this question edited Sep 6, 2018 at 11:18 Luca Kiebel 10.1k7 gold badges32 silver badges46 bronze badges asked Sep 6, 2018 at 11:10 MalinthaMalintha 4,77612 gold badges55 silver badges87 bronze badges 4-
it does not work with
includes
. you need a different approach. whyincludes
? – Nina Scholz Commented Sep 6, 2018 at 11:13 - Why are you using .includes() for that? Is this a requirement? – Commented Sep 6, 2018 at 11:13
-
Why would you need to check it with
myarr.includes
? Thats not the right method for the job – Luca Kiebel Commented Sep 6, 2018 at 11:13 -
myarr.some(x=>x.class=='y')
?? – Jaydip Jadhav Commented Sep 6, 2018 at 11:14
6 Answers
Reset to default 7To do this you can use the some()
method.
The some() method tests whether at least one element in the array passes the test implemented by the provided function.
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
). 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.
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
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
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:
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.
I use lodash .includes() or .has() methods for things like that:
_.includes({ 'a': 1, 'b': 2 }, 1);
https://lodash./docs/4.17.10#includes
You can also do this with a plain js map, some or other methods.