neiza
neiza

Reputation: 265

Check if a value of an array exist in an object in a different array

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

Answers (3)

Addis
Addis

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

Andrei Todorut
Andrei Todorut

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

CertainPerformance
CertainPerformance

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

Related Questions