@Skrolea

Как сравнить объекты в массиве?

Не могу врубиться. Решил поизучать на примере корзины. Необходимо сделать добавление в корзину только в том случае, если там нет этого объекта.
function addItemsListInCart(id,name) {
     
       var objItems = {
            id : id,
            name : name         
        };
        
       
       if (vm.cartItems.indexOf(objItems) === -1) {
           vm.cartItems.push(objItems);
       }     
       console.log(vm.cartItems);
            }

Так не работает. Надо делать сравнение каких-то значений свойств объекта? Т.е. допустим только по Id в объекте? Как это вообще делается?
  • Вопрос задан
  • 5720 просмотров
Решения вопроса 1
miraage
@miraage
Старый прогер
Разумеется, он хочет найти по референсу.
Если бы Вы использовали lodash, было бы весьма просто сделать так:
if (!~_.findIndex(vm.cartItems, objItems)) {
  vm.cartItems.push(objItems);
}

Либо самому в цикле проходить.

// EDIT

DEMO

var cartItems = [
  {id: 1, name: 'foo'},
  {id: 2, name: 'bar'}
];

var itemExists = {
  id: 1,
  name: 'foo'
};

var itemNew = {
  id: 3,
  name: 'baz'
};

function hasItem(collection, needle) {
  for (var i = 0, ii = collection.length; i < ii; ++i) {
    var item = collection[i];
    var keys = Object.keys(needle),
        matched = 0;
    
    keys.forEach(function (key) {
      if (item[key] == needle[key]) {
        ++matched;
      }
    });
    
    if (matched === keys.length) {
      return true;
    }
  }
  
  return false;
}

console.log(hasItem(cartItems, itemExists));
console.log(hasItem(cartItems, itemNew));
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Проверка, есть ли элемент с текущим id в массиве элементов.
var exists = cartItems.any(
    function(element) { 
        return element.id === id;
    }
);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы