Как вернуть объект, который имеет разницу между двумя объектами массива, используя lodash - PullRequest
0 голосов
/ 23 марта 2020

например

let array1 = [
  { 'id': 1010, 'name': 'grapes' }, 
  { 'id': 2020, 'name': 'blueberry' },
  { 'id': 3030, 'name': 'banana' }
]

let array2 = [
  { 'id': 1010, 'name': 'apple' }, 
  { 'id': 2020, 'name': 'blueberry' }, 
  { 'id': 4040, 'name': 'banana' },
  {'id' : 5050, name 'jackfruit'}
]

вывод должен быть

let result = [
  { 'id': 1010, 'name': 'grapes' },
  { 'id': 3030, 'name': 'banana' },
  { 'id': 4040, 'name': 'banana' },
  { 'id' : 5050, name 'jackfruit'}
]

здесь необходимо получить массив, содержащий необычные данные объекта ENTRY { 'id': 2020, 'name': 'blueberry' } удаляется, так как идентификатор и имя являются общими в оба массива

Ответы [ 2 ]

1 голос
/ 23 марта 2020

В этих примерах используется набор данных из исходного вопроса, но logi c все еще обозначает обновленный вопрос.

В зависимости от желаемого результата, вы можете получить разницу между массивами, например так:

const result = _.differenceWith(array1, array2, _.isEqual);

Это выдаст

{ id: 1010, name: "grapes" }

Если вам нужна разница в симметрии c, вы можете также объединить противоположное:

const result = _.differenceWith(array1, array2, _.isEqual).concat(_.differenceWith(array2, array1, _.isEqual));

Это даст вам

{ id: 1010, name: "grapes" }
{ id: 1010, name: "apple" }
{ id: 3030, name: "banana" }

Результат, который вы процитировали в своем вопросе, немного отличается, он не является ни разницей, ни симметрией c разницы, если вы хотите получить только один результат для каждого идентификатора, вам нужно будет удалить второй случай любой объект с идентификатором ключа, который уже существует, например:

result = result.filter((elm, i) => !result.find((elm2, j) => elm.id === elm2.id && i > j) );

, который даст вам

{ id: 1010, name: "grapes" }
{ id: 3030, name: "banana" }
0 голосов
/ 23 марта 2020

В случае, если вы хотите свернуть свое собственное.

Следующий код находит объединение, сортирует его по соответствующему свойству и затем пересекает его. Если ключ совпадает с предыдущим, то найден дубликат, и оба элемента удалены.

function except(a,b) {
    const union = [...a, ...b]
    union.sort(({id: id1}, {id: id2}) => id1 - id2)
    const except = []
    let previous = null
    for(const el of union) {
        if(el.id === previous) {
            except.pop()
            continue;
        }
        except.push(el)
        previous = el.id
    }
    return except
}

let arr1 = [
  { 'id': 1010, 'name': 'grapes' }, 
  { 'id': 2020, 'name': 'blueberry' },
  { 'id': 3030, 'name': 'banana' }
]

let arr2 = [
  { 'id': 0000, 'name': 'apple' }, 
  { 'id': 2020, 'name': 'blueberry' }, 
  { 'id': 4040, 'name': 'banana' },
  {'id' : 5050, name: 'jackfruit'}
]

console.log(except(arr1, arr2))
...