Как объединить массив объектов с помощью lodash - PullRequest
0 голосов
/ 18 октября 2019

Я хотел бы объединить все объекты в одном массиве в один объект с помощью пользовательской функции. Использование mergeWith в lodash работает хорошо:

let a = [{a: [1,2]}, {a:[3,4]}, {a: [7,8]}]
let b = mergeWith(
  a[0],
  ...a.slice(1),
  (objValue: any, srcValue: any) => {
    if (Array.isArray(objValue)) {
      return objValue.concat(srcValue);
    }
  },
);
console.log(b);
// result: {a:[1,2,3,4,7,8]}

Это хорошо работает, но кажется, расточительно создавать копию массива только для этого (a.slice(1)) - есть ли другой способ передать этот массив в mergeWith

1 Ответ

0 голосов
/ 18 октября 2019

Ваш код на самом деле мутирует a[0]. Однако, если вы хотите изменить первый элемент, достаточно просто a mergeWith(...a, fn):

let a = [{a: [1,2]}, {a:[3,4]}, {a: [7,8]}]
let b = _.mergeWith(
  ...a,
  (objValue, srcValue) => _.isArray(objValue) ? objValue.concat(srcValue) : undefined,
);
console.log(b); // result: {a:[1,2,3,4,7,8]}
console.log(a[0]);  // result: {a:[1,2,3,4,7,8]}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

Если вы не хотите мутировать 1-й элемент массива, разверните в новый объект mergeWith({}, ...a, fn):

let a = [{a: [1,2]}, {a:[3,4]}, {a: [7,8]}]
let b = _.mergeWith(
  {}, // new object
  ...a,
  (objValue, srcValue) => _.isArray(objValue) ? objValue.concat(srcValue) : undefined,

);
console.log(b); // result: {a:[1,2,3,4,7,8]}
console.log(a[0]);  // result: {a:[1,2]}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
...