Reputation: 265
I want to check if a value in array1 exists in an object in array2.
array1:
[2,5,1]
array2:
[
{ value: 1, name: 'Monday', isSelected: false },
{ value: 2, name: 'Tuesday', isSelected: false },
{ value: 3, name: 'Wednesday', isSelected: false },
{ value: 4, name: 'Thursday', isSelected: false },
{ value: 5, name: 'Friday', isSelected: false },
]
What I want to achieve is to check array1
against array2
property named value
. If the value of an object in array2
is included in array1
, the isSelected
property should be updated to true. I've tried:
this.setState(prevState => ({
...prevState,
array2: prevState.array2.map(el => {
if (el.value === array2) {
return {
...el,
isSelected: !el.isSelected
}
}
return el;
})
}))
Upvotes: 0
Views: 106
Reputation: 2530
You may also use some()
and includes()
const arr1 = [2,5,1];
const arr2 = [{ value: 1, name: 'Monday', isSelected: false }, { value: 2, name: 'Tuesday', isSelected: false }, { value: 3, name: 'Wednesday', isSelected: false },
{ value: 4, name: 'Thursday', isSelected: false }, { value: 5, name: 'Friday', isSelected: false },
];
let isSelected = arr2.some(obj => arr1.includes(obj.value));
console.log(isSelected)
Upvotes: 0
Reputation: 4526
The best approach here is to check array2 against array1. Below is a working code snippet.
let values = [
{ value: 1, name: 'Monday', isSelected: false },
{ value: 2, name: 'Tuesday', isSelected: false },
{ value: 3, name: 'Wednesday', isSelected: false },
{ value: 4, name: 'Thursday', isSelected: false },
{ value: 5, name: 'Friday', isSelected: false },
]
const selectedValues = [2,5,1];
values = values.map((item) => {
if(selectedValues.indexOf(item.value) > -1) {
item.isSelected = true;
}
return item;
});
console.log(values);
And here is the link from jsbin: https://jsbin.com/nikabegobe/edit?js,console,output
Upvotes: 3
Reputation: 370689
Inside the .map
callback, always return, and set the isSelected
property to whether array1.includes(obj.value)
, where obj
is the object you're iterating over:
const array1 = [2, 5, 1];
const array2 = [{
value: 1,
name: 'Monday',
isSelected: false
}, {
value: 2,
name: 'Tuesday',
isSelected: false
}, {
value: 3,
name: 'Wednesday',
isSelected: false
},
{
value: 4,
name: 'Thursday',
isSelected: false
}, {
value: 5,
name: 'Friday',
isSelected: false
},
];
const output = array2.map(obj => ({
...obj,
isSelected: array1.includes(obj.value)
}));
console.log(output);
It's not entirely clear, but if isSelected
properties can start out as true
and you want to preserve them, despite the numbers not existing in the array1
, change to isSelected: obj.selected || array1.includes(obj.value)
.
Upvotes: 5