У меня есть следующее
let user = { name: 'John', lastName: 'Doe', phone: '000111222' };
let otherInfo = { phone: '123456', age: '30' };
После объединения обоих
let result = { ...user, ...otherInfo };
Я получил
{ name: 'John', lastName: 'Doe', phone: '123456', age: '30' };
Исходя из этого, телефон является дублированной записью, я хочу сохранить старый телефон и сохранить оба в массиве, на основе распространения ES6, обратите внимание: (я могу выполнять итерацию объекта, но лучше писать меньше кода) сильный>
{ name: 'John', lastName: 'Doe', phone: ['000111222', '123456'], age: '30' };
Некоторые идеи?, Заранее спасибо.
4 ответа
Ты можешь это сделать:
let result = { ...user, ...otherInfo, phone: user.phone && otherInfo.phone ? [user.phone, otherInfo.phone]: user.phone || otherInfo.phone };
Объедините объекты вместе и получите все уникальные ключи с помощью Object.keys()
. Уменьшите ключи и проверьте, существует ли ключ в объектах. Если он существует в обоих из них, объедините значения в массив. Если он не принимает значение от одного из объектов:
const fn = (o1, o2) => Object.keys({ ...o1, ...o2 }) // get combined keys
.reduce((acc, key) => {
// if key exists it both object combine the values in an array
if (key in o1 && key in o2) acc[key] = [o1[key], o2[key]];
// take the value from o1 or o2
else acc[key] = key in o1 ? o1[key] : o2[key];
return acc;
}, {});
const user = { name: 'John', lastName: 'Doe', phone: '000111222' };
const otherInfo = { phone: '123456', age: '30' };
const result = fn(user, otherInfo);
console.log(result);
ЭТО 1 строка кода
Let result = Object.assign ({}, info, otherInfo, {phone: [info.phone, otherInfo.phone]})
Object.Assign работает быстрее
Для общего решения, когда вам может потребоваться объединить более двух объектов, вы можете применить Object.entries
к каждому из объектов и создать плоский массив результирующих пар. Затем используйте эти пары для расширения объекта результата. Когда пара ссылается на ключ, который уже находится в объекте результата, используйте [].concat
, чтобы незаметно объединить это значение с новым значением в массив. Это также работает, если сохраненное значение уже было массивом с двумя или более ранее найденными значениями.
Вот отрывок:
const user = { name: 'John', lastName: 'Doe', phone: '000111222' };
const otherInfo = { phone: '123456', age: '30' };
const moreInfo = { phone: '9876543', hometown: 'Paris' };
let res = {};
for (let [k, v] of [user, otherInfo, moreInfo].flatMap(Object.entries)) {
res[k] = k in res ? [].concat(res[k], v) : v;
}
console.log(res);
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.