Как отфильтровать массив, сравнив два массива объектов с разными элементами в своих объектах? - PullRequest
0 голосов
/ 25 мая 2018

Как отфильтровать массив, сравнив два массива объектов с разными элементами в своих объектах?У меня есть:

arr1 =[{ x: 1, y: 2, z:3 }, { x: 2, y: 1, z:4 }];

arr2 = [{ x: 1, y: 2, a:5 }, { x: 2, y: 3, a:4 }];

Я хочу сравнить значения x и y из обоих массивов и вернуть объект без выделения из первого массива, в приведенном выше примере вернуть [{ x: 2, y: 1, z:4 }] Я пытался использовать _.differenceWith(arr1, arr2, _.isEqual);, но, очевидно,для этого в массивах должны быть похожие объекты, что не в моем случае.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Вы очень близки к правильному ответу.Функция _.differenceWith из lodash имеет три аргумента: проверяемый массив, исключаемые значения и третий аргумент - компаратор, который определяет, какие значения вам нужны.В вашем случае, использование _.isEqual ищет точно такой же объект (что, насколько я понял, не является вашим желаемым поведением).

Если вам нужно только иметь одинаковые значения x и yпопробуйте использовать свой собственный компаратор вместо функции _.isEqual из lodash.

Это будет выглядеть примерно так:

const arr1 = [{ x: 1, y: 2, z:3 }, { x: 2, y: 1, z:4 }];    
const arr2 = [{ x: 1, y: 2, a:5 }, { x: 2, y: 3, a:4 }];

// this is your custom comparator which is called with each value from the two arrays
// I gave descriptive names to the arguments so that it is more clear
const customComparator = (valueFromFirstArray, valueFromSecondArray) =>
  valueFromFirstArray.x === valueFromSecondArray.x
  && valueFromFirstArray.y === valueFromSecondArray.y;

const result = _.differenceWith(arr1, arr2, customComparator);

console.log(result);
// will print [{x: 2, y: 1, z: 4}]

Или, если вы не знакомы с функциями стрелок, пользовательскиеКомпаратор может быть объявлен так:

function customComparator(valueFromFirstArray, valueFromSecondArray) {
  return valueFromFirstArray.x === valueFromSecondArray.x
    && valueFromFirstArray.y === valueFromSecondArray.y
}

Вот скрипка , где вы можете пообщаться с пользовательским компаратором, если хотите.

0 голосов
/ 25 мая 2018

Используйте функцию фильтра

arr1 =[{ x: 1, y: 2, z:3 }, { x: 2, y: 1, z:4 }];
arr2 = [{ x: 1, y: 2, a:5 }, { x: 2, y: 3, a:4 }];


let notMatched = arr2.filter(function (item, index) {
  return !(item.x === arr1[index].x && item.y == arr1[index].y);
});
console.log(notMatched);
...