Как получить разницу между двумя массивами объектов в JavaScript

объяснение

Комментарий попросил более подробное объяснение для начинающих. Вот попытка.

Мы передаем следующую функцию makeSymmDiffFunc:

function(x, y) { return x.value === y.value {amp}amp;{amp}amp; x.display === y.display; } 

Эта функция — то, как мы решаем, что два объекта равны. Как и все функции, которые возвращают true или false, ее можно назвать «функцией предиката», но это всего лишь терминология.

Используя это, makeSymmDiffFunc (читаем «сделать функцию симметричной разности») возвращает нам новую функцию:

  return function(a, b) { return complement(pred, a, b).concat(complement(pred, b, a)); }; 

Это функция, которую мы на самом деле будем использовать. Мы передаем ему два списка, и он находит элементы в первом, а не во втором, затем элементы во втором, не в первом, и объединяет эти два списка.

Оглядываясь на это снова, я определенно мог бы взять реплику из вашего кода и немного упростить основную функцию, используя некоторые из них:

 var makeSymmDiffFunc = (function() { var complement = function(pred, a, b) { return a.filter(function(x) { return !b.some(function(y) {return pred(x, y);}); }); }; return function(pred) { return function(a, b) { return complement(pred, a, b).concat(complement(pred, b, a)); }; }; }()); 

дополнение использует предикат и возвращает элементы своего первого списка, а не второго. Это проще, чем мой первый проход с отдельной функцией содержимого.

Наконец, основная функция обернута в немедленно вызванное выражение функции (IIFE), чтобы сохранить внутреннюю функцию дополнения вне глобальной области видимости.

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector