Каков наилучший способ отфильтровать массив объектов, чтобы показать только те объекты, которые были добавлены с момента последней фильтрации? - PullRequest
1 голос
/ 08 мая 2019

Моя первая функция собирает на сайте работодателей список пользователей, выполнивших задачу, и выводит файл json, содержащий результаты.Файл json организован следующим образом:

{"Completed":[{"task":"TitleOfTaskAnd01/01/2019", "name":"UsersFullName"},{"task":"TitleOfTaskAnd01/01/2019", "name":"UsersFullName"}...]}

Моя вторая функция использует вышеупомянутый файл json для автоматической генерации квитанций.При повторном вызове этих двух функций я хотел бы опустить все ранее использованные данные и генерировать квитанции только для задач, которые не были получены в результате каких-либо предыдущих вызовов, поэтому избегая генерации дубликатов.

Я попытался отфильтровать первый массив по элементам второго массива, однако, насколько я могу судить, вы не можете сравнивать объекты или даже массивы в этом отношении.Вот функция, которую я пытался приспособить к своим потребностям:

let myArray = myArray.filter( ( el ) => !toRemove.includes( el ) );

Я ожидаю, что мой сценарий использования не является чем-то необычным, и уже есть большой опыт относительно лучших практик в этой ситуации.Я предпочитаю решения, которые используют только javascript, чтобы я мог понять, как лучше ориентироваться в ситуации в будущем.Однако, если у вас есть решение библиотеки / модуля, которое также приветствуется.Заранее спасибо.

1 Ответ

1 голос
/ 08 мая 2019

Проблема в том, что два объекта никогда не равны (за исключением того, что они являются ссылками на один и тот же объект).Чтобы проверить структурное равенство, вы должны вручную сравнить их свойства:

  myArray.filter(el => !toRemove.some(el2 => el.task === el2.task && el.name === el2.name));

Пока это работает, для многих элементов это будет довольно медленно, если вы сравните каждый объект myArray со всеми объектами toRemove.Чтобы улучшить это, вы можете сгенерировать уникальный хеш из свойств и добавить этот хеш в Set:

  const hash = obj => JSON.stringify([obj.name, obj.task]);

  const remove = new Set(toRemove.map(hash));

  const result = myArray.filter(el => !remove.has(hash(el)));

Это будет O (n + m), тогда как предыдущими решениями было O (n *).м).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...