У меня есть следующее

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' };

Некоторые идеи?, Заранее спасибо.

0
Yoshio H Palacios 16 Янв 2021 в 23:03

4 ответа

Лучший ответ

Ты можешь это сделать:

let result = { ...user, ...otherInfo, phone: user.phone && otherInfo.phone ? [user.phone, otherInfo.phone]: user.phone || otherInfo.phone };
0
domenikk 16 Янв 2021 в 21:03

Объедините объекты вместе и получите все уникальные ключи с помощью 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);
3
Ori Drori 16 Янв 2021 в 20:17

ЭТО 1 строка кода

Let result = Object.assign ({}, info, otherInfo, {phone: [info.phone, otherInfo.phone]})

Object.Assign работает быстрее

0
Vince 16 Янв 2021 в 20:23

Для общего решения, когда вам может потребоваться объединить более двух объектов, вы можете применить 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);
0
trincot 16 Янв 2021 в 20:37
65754136