#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'}
]
- Сравните два объекта (‘оригинальный’ и ‘отредактированный’)
- Если задан ‘id’, сравните данные тех же идентификаторов и возьмите данные из ‘edited’ и получите ТОЛЬКО ‘id’ и отредактированные данные.
- Если ‘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 для сравнения, а затем добавьте обратно идентификатор к объекту.