JavaScript: сравнение двух объектов

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

Я хочу сравнить два объекта, чтобы создать новый объект.

 original = [
            {id: "A1", name: "Nick", age: 20, country: 'JP', code: 'PHP'}
           ]

edited = [
          {name: "Mike", age: 30, country: 'US'},
          {id: "A1", name: "Nick", age: 25, country: 'US', code: 'PHP'}
         ]
  
  1. Сравните два объекта (‘оригинальный’ и ‘отредактированный’)
  2. Если задан ‘id’, сравните данные тех же идентификаторов и возьмите данные из ‘edited’ и получите ТОЛЬКО ‘id’ и отредактированные данные.
  3. Если ‘id’ не задан, сохраните все данные

Конечный объект, который я хочу, выглядит следующим образом;

 final = [
         {name: "Mike", age: 30, country: 'US'},
         {id: "A1", age: 25, country: 'US'}
        ]
  

Я пробовал это с помощью filter, но не могу получить желаемый результат…

Комментарии:

1. Пожалуйста, добавьте код, который вы пробовали с помощью filter.

Ответ №1:

Попробуйте с Array#reduce .

Обновлено, все пары ключей совпадают

  • Проверьте, доступно ли отредактированное значение идентификатора массива в исходном массиве, используя функцию Array#map и indexOf
  • Если нет, переместите весь объект в новый массив
  • Сначала воссоздайте исходный массив в формате объекта, подобном {key:[value]}
  • Затем сопоставьте каждую пару ключ-значение, совпадающую или нет с forEach внутри функции reduce

 var original = [{id: "A1", name: "Nick", age: 20, country: 'JP'}];
var edited = [{name: "Mike", age: 30, country: 'US'},{id: "A1", name: "Nick", age: 25, country: 'US'}];

var ids_org = Object.keys(original[0]).reduce((a,b,c)=> (a[b]=original.map(a=> a[b]),a),{});

var res = edited.reduce((a, b) => {
  if (b.id) {
      Object.keys(b).forEach(i=>{
      if(ids_org[i].indexOf(b[i]) > -1 amp;amp; i != 'id')
         delete b[i];
      })
     a.push(b);
  } else {
    a.push(b);
  }
  return a;
}, []);

console.log(res)  

Комментарии:

1. Я не думал об использовании reduce …!! но я хочу сравнить два объекта и извлечь все различия. Например, если ‘county’ также был одинаковым в ‘original’ и ‘edited’, мне нужно удалить и это, а не только ‘name’…

2. The final object I want is like below; это не так. Не могли бы вы изменить массив, как вы ожидаете. Ваше требование не совпадает с ожидаемым результатом

3. Я отредактировал ‘original’ и ‘edited’ объекты, пожалуйста, взгляните

4. вам нужно удалить одно и то же значение из пары ключ-значение. Но ожидаемый идентификатор правильный?

Ответ №2:

используйте деструктурирование, чтобы извлечь идентификатор из объекта. используйте метод Lodash isEqual для сравнения, а затем добавьте обратно идентификатор к объекту.