Лодаш и слияние массивов с ключом - PullRequest
0 голосов
/ 30 апреля 2019

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

Вот пример Doc 1

[
    {
         "id": 123,
         "Key1": "Test 1",
         "Key3": "Test 0"
    },
    {
         "id": 456,
         "Key1": "Test 2",
         "Key2": "Test 3"
    }
]

Doc 2 [

    {
         "id": 123,
         "Key2": "Test 7",
         "Key3": "Test 8"
    },
    {
         "id": 789,
         "Key1": "Test 5",
         "Key2": "Test 6"
    }
]

Основываясь на простом примере выше, я ищу такой вывод

[
    {
         "id": 123,
         "Key1": "Test 1",
         "Key2": "Test 7",
         "Key3": "Test 8"
    },
    {
         "id": 456,
         "Key1": "Test 2",
         "Key2": "Test 3"
    },
    {
         "id": 789,
         "Key1": "Test 5",
         "Key2": "Test 6"
    }
]

Ответы [ 2 ]

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

Используйте поток для создания функции.Объедините массивы в один массив, сгруппируйте их по id, затем сопоставьте группы и объедините каждую группу в один объект:

const { flow, concat, partialRight: pr, groupBy, map, merge } = _

const mergeArrays = flow(
  concat, // concat to a single array
  pr(groupBy, 'id'), // group item by id
  pr(map, g => merge({}, ...g)) // merge each group to a single object
)

const arr1 = [{"id":123,"Key1":"Test 1","Key3":"Test 0"},{"id":456,"Key1":"Test 2","Key2":"Test 3"}]
const arr2 = [{"id":123,"Key2":"Test 7","Key3":"Test 8"},{"id":789,"Key1":"Test 5","Key2":"Test 6"}]

const result = mergeArrays(arr1, arr2)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

И более краткая версия этого решения с lodash / fp :

const { flow, concat, groupBy, map, mergeAll } = _

const mergeArrays = flow(
  concat, // concat to a single array
  groupBy('id'), // group item by id
  map(mergeAll) // merge each group to a single object
)

const arr1 = [{"id":123,"Key1":"Test 1","Key3":"Test 0"},{"id":456,"Key1":"Test 2","Key2":"Test 3"}]
const arr2 = [{"id":123,"Key2":"Test 7","Key3":"Test 8"},{"id":789,"Key1":"Test 5","Key2":"Test 6"}]

const result = mergeArrays(arr1, arr2)

console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
0 голосов
/ 30 апреля 2019

const addKeys = (results, keys) => keys.reduce(
  (final, item) => {
    const id = item.id;
    let current = final.find(i => i.id === id);
    if (!current) {
      current = { id: id };
      final.push(current);
    }
    Object.keys(item).forEach(key => { current[key] = item[key] });
    return final;
  }, results
);

console.log(addKeys(
  [
      {
           "id": 123,
           "Key1": "Test 1",
           "Key3": "Test 0"
      },
      {
           "id": 456,
           "Key1": "Test 2",
           "Key2": "Test 3"
      }
  ],
  [

      {
           "id": 123,
           "Key2": "Test 7",
           "Key3": "Test 8"
      },
      {
           "id": 789,
           "Key1": "Test 5",
           "Key2": "Test 6"
      }
  ]
));
...