Пользовательские элементы суммы по ключу с использованием lodash - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть два объекта, содержащие ключи, такие как

var a = {bar:[1,2], foo:[7,9]}
var b = {bar:[2,2], foo:[3,1]}

Я хочу получить следующие результаты:

var c = {bar:[3,4], foo:[10,10]}

У меня уже есть логика for, такая как:

for (let key in b) {
  if (a[key]) {
      a[key][0] += b[key][0];
      a[key][1] += b[key][1];
  } 
  else a[key] = b[key];
}

Но я бы хотел сделать эту логику лодашным способом.Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Вы можете сделать это, используя простой JavaScript с Object.entries, concat и reduce:

const a = { bar: [1,2], foo: [7,9] };
const b = { bar: [2,2], foo: [3,1] };

const entries = Object.entries(a).concat(Object.entries(b));

const result = entries.reduce((accum, [key, val]) => {
  accum[key] = accum[key] ? accum[key].map((x, i) => x + val[i]) : val;
  return accum;
}, { });

console.log(result);
0 голосов
/ 05 февраля 2019

Вы можете использовать функцию создания, которая принимает n объекты и собирает их в массив, используя остальные параметры .Теперь вы можете распределить массив в _.mergeWith(), чтобы объединить объекты, и в функции настройщика суммировать элементы в массивах, используя Array.map() или lodash's_.map() и _.add():

const { mergeWith, isArray, map, add } = _

const fn = (...rest) => _.mergeWith({}, ...rest, (o = [], s) =>
  map(s, (n, i) => add(n, o[i]))
)

const a = {bar:[1,2], foo:[7,9]}
const b = {bar:[2,2], foo:[3,1]}
const c = {bar:[3,2], foo:[5,6]}
const d = {bar:[4,2], foo:[5,4]}

const result = fn(a, b, c, d)

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

Вы также можете использовать lodash / fp , чтобы создать функцию, которая объединит все значения в многомерный массив с _.mergeAllWith(), а затем транспонируетмассивы, используя _.zipAll(), и суммирует каждый массив:

const { rest, flow, mergeAllWith, isArray, head, mapValues, zipAll, map, sum } = _

const fn = rest(flow(
  mergeAllWith((o, s) => [...isArray(head(o)) ? o : [o], s]), // combine to a multidimensional array
  mapValues(flow(
    zipAll,
    map(sum)
  )),
))

const a = {bar:[1,2], foo:[7,9]}
const b = {bar:[2,2], foo:[3,1]}
const c = {bar:[3,2], foo:[5,6]}
const d = {bar:[4,2], foo:[5,4]}

const result = fn(a, b, c, d)

console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
...