Есть ли простой способ объединять объекты и суммировать их свойства int вместо переопределения в javascript es2018? - PullRequest
0 голосов
/ 14 февраля 2019

Хорошо, вот что я имею в виду.

У меня есть два примера объектов

let obj1 = { x: 60 };

let obj2 = { x: 9 };

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

let obj3 = { x: 69 };

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

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

Спасибо.

Ответы [ 3 ]

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

Как это?

let obj1 = { x: 60 };
let obj2 = { x: 9 };

let obj3 = [obj1, obj2].reduce((s,a)=>{return {x: s.x+a.x}}, {x:0});
 
console.log(obj3);

// or more shortener:

obj3 = {x:[obj1, obj2].reduce((s,a)=> s + a.x,0)};

console.log(obj3);

// for arbitrary properties, not just x:

keys = Object.keys(obj1),
obj3 = [obj1, obj2].reduce(function (r, o) {
    keys.forEach(function (k) {
        r[k] += o[k];
    });
    return r;
}, keys.reduce(function (r, k) {
    r[k] = 0;
    return r;
}, Object.create(null)));

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

Вы можете уменьшить объекты, взяв произвольное количество объектов, и уменьшить пары ключ / значение, соблюдая вложенные объекты.

const
    add = (...a) => a                         // take all parameters
        .map(Object.entries)                  // get entries
        .reduce((a, b) => [...a, ...b], [])   // flat entries
        .reduce((o, [k, v]) => {
            o[k] = v && typeof v === 'object' // assign if object
                ? add(o[k] || {}, v)          //   result of recursive call
                : (o[k] || 0) + v;            //   or sum the value
            return o;
        }, {});

let obj1 = { x: 60, y: { z: 3 } },
    obj2 = { x: 9, y: { z: 1, a: 32 } },
    obj3 = { y: { a: 10 } },
    result = add(obj1, obj2, obj3);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 14 февраля 2019

Если вы хотите использовать библиотеку Lodash, вы можете сделать это с помощью метода mergeWith.

let obj1 = { x: 60, b: "foo", c: {y: 3, x: 'bar'} };
let obj2 = { x: 9, a: 'bar', c: {y: 4} };

const sum = _.mergeWith(obj1, obj2, (a, b) => {
  if (_.every([a, b], _.isNumber)) return a + b;
})

console.log(sum)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...