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

时间:2018-06-28 16:05:29

标签: javascript arrays json object lodash

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

{
  make: 'Ford',
  model: 'Focus',
  color: 'red',
  year: 2016
}

在这个数组中吗?

[
  {
    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
  }
]

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

2 个答案:

答案 0 :(得分:1)

创建一个函数并使用everyfunction exists(arr, obj, ...keys) { return arr.some(e => keys.every(k => e[k] && obj[k] && e[k] === obj[k])); } console.log(exists(arr, check, 'make', 'model'));,下面的方法适用于您传入的任何键。

<script>
let arr = [
    {
        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
    }
]

let check = {
    make: 'Ford',
    model: 'Focus',
    color: 'red',
    year: 2016
};

</script>
\b

答案 1 :(得分:1)

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

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

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

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

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