partyzanx
@partyzanx

Почему работает эта функция .filter при удалении одинаковых объектов?

В общем, была задача удалить повторяющиеся объекты из массива
Нашёл решение
let uniqIds = {}, source = [{id:'a'},{id:'b'},{id:'c'},{id:'b'},{id:'a'},{id:'d'}];
let filtered = source.filter(obj => !uniqIds[obj.id] && (uniqIds[obj.id] = true));
console.log(filtered);
// EXPECTED: [{id:'a'},{id:'b'},{id:'c'},{id:'d'}];


Прошу объяснить почему работает это решение:) Не понятно вот это !uniqIds[obj.id] && (uniqIds[obj.id] = true)
  • Вопрос задан
  • 57 просмотров
Решения вопроса 2
Raxen
@Raxen
Lead Frontend Developer, Beeline
source.filter(obj => !uniqIds[obj.id] && (uniqIds[obj.id] = true));
1. Метод фильтр берет каждый элемент (obj) и создает новый массив из элементов, которые подходят под условие
2. Условие !uniqIds[obj.id] означает, что если элемента массива с текущим элементом цикла нет в пустом массиве, то это пустому массиву с индексом этого элемента присваивается значение true
типа
obj => !uniqIds[obj.id] && (uniqIds[obj.id] = true)

в текущий итерационный момент выглядит так

source.filter((obj) => {
  console.log(obj.id);
  //=> 'a'

  // return !uniqIds[obj.id] && (uniqIds[obj.id] = true) - это тоже самое, что и 
  if (uniqIds[obj.id] !== 'undefined') { //   if (uniqIds['a'] !== 'undefined') {
    uniqIds[obj.id] = true;  // uniqIds['a'] = true; => [{a: true}]

    return true;
  }
}

В двух словах - не встретилось значение одного массива в ключе другого, значит подходит

Содержимое массива uniqIds:
uniqIds = [
  'a': true,
  'b': true,
  'c': true,
  'd': true,
]
Ответ написан
Seasle
@Seasle Куратор тега JavaScript
Посмотрите это еще.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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