Проверьте массив объектов по нескольким свойствам - PullRequest
0 голосов
/ 28 июня 2018

У меня есть массив объектов, которые мне нужно проверить, если подобный объект уже существует в массиве. Например, есть ли объект с такими же свойствами марки и модели (Ford Focus):

{
  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).

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Javascript имеет некоторые () и фильтр ()

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 } ]
0 голосов
/ 28 июня 2018

Создайте функцию и используйте some и every, ниже работает для любых клавиш, которые вы вводите.

function 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>
...