通过多个属性检查对象数组

Mat*_*ell -2 javascript arrays json object lodash

我有一个对象数组,我需要检查数组中是否已存在类似的对象。例如,是否存在具有相同品牌和型号属性的对象(福特福克斯):

{
  make: 'Ford',
  model: 'Focus',
  color: 'red',
  year: 2016
}
Run Code Online (Sandbox Code Playgroud)

在这个数组中?

[
  {
    make: 'Ford',
    model: 'Focus',
    color: 'blue',
    year: 2008
  },
  {
    make: 'Ford',
    model: 'Mustang',
    color: 'red',
    year: 2011
  },
  {
    make: 'Chevy',
    model: 'Malibu',
    color: 'blue',
    year: 2012
  },
  {
    make: 'Ford',
    model: 'Focus',
    color: 'black',
    year: 1999
  }
]
Run Code Online (Sandbox Code Playgroud)

我更喜欢 ES6 方法,但也可以使用 lodash。Lodash 有 _.some 但据我所知,它匹配整个对象(不仅仅是所需的特定属性)或仅匹配一个属性。此外,我需要类似 _.pullAllWith 的东西,我可以在其中删除包含这些特定属性的所有对象(即删除包含福特福克斯的所有对象)。

Dam*_*lta 5

Javascript有some()filter()

var cars = [
  {
    make: 'Ford',
    model: 'Focus',
    color: 'blue',
    year: 2008
  }, {
    make: 'Ford',
    model: 'Mustang',
    color: 'red',
    year: 2011
  }, {
    make: 'Chevy',
    model: 'Malibu',
    color: 'blue',
    year: 2012
  }, {
    make: 'Ford',
    model: 'Focus',
    color: 'black',
    year: 1999
  }
];
Run Code Online (Sandbox Code Playgroud)

使用 some() 您可以查找数组中的某些元素是否包含该属性:

const containsFordFocus = cars.some( car =>  car.make === 'Ford' && car.model === 'Focus');
console.log(containsFordFocus); // true
Run Code Online (Sandbox Code Playgroud)

使用过滤器,您可以排除一些元素:

const filteredArray = cars.filter( car => car.make !== 'Ford' && car.model !== 'Focus');
console.log(filteredArray); // [ { make: 'Chevy', model: 'Malibu', color: 'blue', year: 2012 } ]
Run Code Online (Sandbox Code Playgroud)