Как объединить списки объектов на основе их идентификаторов, используя оператор распространения (ES6) - PullRequest
0 голосов
/ 19 февраля 2020

скажем, у меня есть два списка объектов:

list1 = [{id: 1, name: "tom", age:25}, {id: 2, name: "brad", age:35}, {id: 3, name: "marry", age:23}] 

и

list2 = [{id: 1, OS: "Windows"}, {id: 2, OS: "Mac"}]; 

как мне получить

finalList = [{id: 1, name: "tom", age:25, OS: "Windows"}, {id: 2, name: "brad", age:35, OS: "Mac"}, {id: 3, name: "marry", age:23}

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

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Вы можете использовать .map(), чтобы вернуть новый результат на основе list1 и .find(), чтобы получить соответствующий элемент из list2 для list1 элемент:

let list1 = [{id: 1, name: "tom", age:25}, {id: 2, name: "brad", age:35}, {id: 3, name: "marry", age:23}];

let list2 = [{id: 1, OS: "Windows"}, {id: 2, OS: "Mac"}];

let result = list1.map(x => {
    let l2 = list2.find(y => y.id === x.id);
    return l2 ? { ...x, ...l2 } : x;
  });
  
 console.log(result);
0 голосов
/ 19 февраля 2020

Это объединит объект любой длины и любого количества аргументов.

function merge(...args) {
    const max_pointer = Math.max(...args.map(arg=>arg.length));
    const test = []
    for (let i = 0; i < max_pointer; i++) {
        let e = args.map(arg=>arg[i]);
        let new_obj = Object.assign({}, ...e);
        test.push(new_obj);
    }
    return test;
}

const list1 = [{id: 1, name: "tom", age:25}, {id: 2, name: "brad", age:35}, {id: 3, name: "marry", age:23}] 
const list2 = [{id: 1, OS: "Windows"}, {id: 2, OS: "Mac"}]; 



console.log(merge(list1, list2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...