Как вернуть массив объектов из `result1`, которых нет в массиве` result2`? - PullRequest
0 голосов
/ 02 ноября 2019

Как сравнить два массива так, чтобы они возвращали массивы объектов, которые не совпадают. Приведенная выше запись возвращает мне массив объектов, которые находятся как в одном, так и в другом. Как мне вернуть массив объектов из result1, которых нет в массиве result2?

let result = result1.filter(o1 => result2.some(o2 => o1.id === o2.id));

Демонстрация здесь: https://stackblitz.com/edit/js-qavyib

var result1 = [
    {id:1, name:'Sandra', type:'user', username:'sandra'},
    {id:2, name:'John', type:'admin', username:'johnny2'},
    {id:3, name:'Peter', type:'user', username:'pete'},
    {id:4, name:'Bobby', type:'user', username:'be_bob'}
];

var result2 = [
    {id:2, name:'John', email:'johnny@example.com'},
    {id:4, name:'Bobby', email:'bobby@example.com'}
];

let result = result1.filter(o1 => result2.some(o2 => o1.id === o2.id));

console.log(result);

/*
  0: Object
  id: 2
  name: "John"
  type: "admin"
  username: "johnny2"
  1: Object
  id: 4
  name: "Bobby"
  type: "user"
  username: "be_bob"*/

Ответы [ 4 ]

4 голосов
/ 02 ноября 2019

Убедитесь, что .every элемент в result2 не имеет равных id:

var result1 = [
    {id:1, name:'Sandra', type:'user', username:'sandra'},
    {id:2, name:'John', type:'admin', username:'johnny2'},
    {id:3, name:'Peter', type:'user', username:'pete'},
    {id:4, name:'Bobby', type:'user', username:'be_bob'}
];

var result2 = [
    {id:2, name:'John', email:'johnny@example.com'},
    {id:4, name:'Bobby', email:'bobby@example.com'}
];

let result = result1.filter(o1 => result2.every(o2 => o1.id !== o2.id));

console.log(result);
2 голосов
/ 02 ноября 2019

Вы можете немного абстрагировать вопрос, чтобы написать функцию, которая принимает предикат, который сообщает вам, равны ли два значения, и затем использовать эту общую функцию с простым (x, y) => x.id == y.id, чтобы получить функцию, которая находит разницу, в которой вы находитесь. находясь в поиске. Как то так:

const diff = (pred) => (xs, ys) => 
  xs.filter(x => !(ys.some(y => pred(x, y))))

const diffById = diff ((x, y) => x.id === y.id) 

const result1 = [{id:1, name:'Sandra', type:'user', username:'sandra'}, {id:2, name:'John', type:'admin', username:'johnny2'}, {id:3, name:'Peter', type:'user', username:'pete'}, {id:4, name:'Bobby', type:'user', username:'be_bob'}]
const result2 = [{id:2, name:'John', type:'admin', username:'johnny2'}, {id:4, name:'Bobby', type:'user', username:'be_bob'}]

console.log (
  diffById (result1, result2)
)
2 голосов
/ 02 ноября 2019

Вы находитесь на правильном пути.

В 2019 году современный подход заключается в использовании filter().

Для сравнения двух массивов и возврата разницы вам необходимо использовать ! (not) оператор.

Рабочий пример:

var result1 = [
    {id:1, name:'Sandra', type:'user', username:'sandra'},
    {id:2, name:'John', type:'admin', username:'johnny2'},
    {id:3, name:'Peter', type:'user', username:'pete'},
    {id:4, name:'Bobby', type:'user', username:'be_bob'}
];

var result2 = [
    {id:2, name:'John', email:'johnny@example.com'},
    {id:4, name:'Bobby', email:'bobby@example.com'}
];

let difference = result1.filter(({ id: id1 }) => !result2.some(({ id: id2 }) => id2 === id1));

console.log(difference);
1 голос
/ 02 ноября 2019

Однострочное решение с использованием Ramda, попробуйте его здесь или ниже:

R.difference(result1, result2);

Примечание: это решение не только проверяет одно свойство, например, id, оно проверяет равенство всех реквизитов.

const result1 = [
{id:1, name:'Sandra', type:'user', username:'sandra'},
{id:2, name:'John', type:'admin', username:'johnny2'},
{id:3, name:'Peter', type:'user', username:'pete'},
{id:4, name:'Bobby', type:'user', username:'be_bob'}
];

const result2 = [
{id:2, name:'John', type:'admin', username:'johnny2'},
{id:4, name:'Bobby', type:'user', username:'be_bob'}
];

const difference = R.difference(result1, result2);
console.log(difference);
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...