简体   繁体   中英

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

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) isSelected: obj.selected || array1.includes(obj.value) .

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

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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