Объединить два массива объектов на основе ключа без сглаживания? - PullRequest
0 голосов
/ 01 апреля 2019

Этот пост является продолжением этого поста Объединение двух массивов объектов на основе ключа Мне нравится @Trevors https://stackoverflow.com/a/51672402/9215279 ответ, но Как объединить массивы, не сгладив их?

Обновлен код

const users = [
    {
        id: 1,
        name: 'Leanne Graham',
        username: 'Bret',
        email: 'Sincere@april.biz',
        address: {
            street: 'Kulas Light',
            suite: 'Apt. 556',
            city: 'Gwenborough',
            zipcode: '92998-3874',
            geo: {
                lat: '-37.3159',
                lng: '81.1496'
            }
        }
    }
]

const posts = [
    {
        userId: 1,
        id: 1,
        title:
            'sunt aut facere repellat provident occaecati excepturi optio reprehenderit',
        body:
            'quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum est autem sunt rem eveniet architecto'
    }
]

const mergeById = (a1, a2) =>
    a1.map(itm => ({
        ...a2.find((item) => (item.id === itm.id) && item),
        ...itm
    }));

console.log(mergeById(users, posts)) 

Вывод

[
  {
    "userId": 1,
    "id": 1,
    "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
    "body": "quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum est autem sunt rem eveniet architecto",
    "name": "Leanne Graham",
    "username": "Bret",
    "email": "Sincere@april.biz",
    "address": {
      "street": "Kulas Light",
      "suite": "Apt. 556",
      "city": "Gwenborough",
      "zipcode": "92998-3874",
      "geo": {
        "lat": "-37.3159",
        "lng": "81.1496"
      }
    }
  }
]

Можете ли вы предложить, как вывести вот так?

[
  {
    "posts": {
        "userId": 1,
            "id": 1,
            "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
            "body": "quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum est autem sunt rem eveniet architecto"
        },
    "name": "Leanne Graham",
    "username": "Bret",
    "email": "Sincere@april.biz",
    "address": {
      "street": "Kulas Light",
      "suite": "Apt. 556",
      "city": "Gwenborough",
      "zipcode": "92998-3874",
      "geo": {
        "lat": "-37.3159",
        "lng": "81.1496"
      }
    }
  }
]

Ответы [ 3 ]

1 голос
/ 01 апреля 2019

Вы можете перебирать каждого пользователя, используя array#map, и находить сообщения, используя array#find, сравнивая userId и id.

const users = [ { id: 1, name: 'Leanne Graham', username: 'Bret', email: 'Sincere@april.biz', address: { street: 'Kulas Light', suite: 'Apt. 556', city: 'Gwenborough', zipcode: '92998-3874', geo: { lat: '-37.3159', lng: '81.1496' } } } ],
      posts = [ { userId: 1, id: 1, title: 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit', body: 'quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum est autem sunt rem eveniet architecto' } ],
      result = users.map(o => ({posts: posts.find(o => o.userId === o.id), ...o}));
console.log(result);
0 голосов
/ 01 апреля 2019

Попробуйте это:

const mergeById = (...arrays) => {
  const unique = {};
  arrays.map(arr => {
    arr.map(val => {
      if (!unique[val.id]) {
        unique[val.id] = val;
        return;
      }
      for (var keys in unique[val.id]) {
        unique[val.id][keys] = unique[val.id][keys] || val[keys]
      }
  });
  return Object.values(unique);
}

console.log(mergeById(array1, array2, ....., arrayN));

Слияние без flattening - это просто еще один цикл, работающий на клавишах.

0 голосов
/ 01 апреля 2019

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

arr1.map(row=>{
    const found = arr1.find(item=>item.id==row.id);
    return Object.assign({}, row, found);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...