Передача аргумента функции, которая преобразуется в назначение объекта

Поэтому экземпляр I имеет следующую функцию:

function merge(arr, key) {
return arr.reduce((r, o) => {
    if (r[o.key]) {
      r[o.key].real += o.real;
    } else {
      r[o.key] = { key: o.key, real: o.real };
    }
    return r;
  }, {});
}

И я хочу использовать его 10 раз, но каждый раз { key: o.key, real: o.real }будет отличаться, например{ key: o.key, valueX: o.valueX }, и т.д.. как создать этот объект в качестве параметра функции? так что если бы я побежал

merge(arr, key, ['key, real']) // object assign will happen to key and real

Я немного запутался там

Случай 1:

var arrayOne = [{ someKey: '22', value: 345 }, { someKey: '22', value: 543 }]

function merge(arr, key) {
    return arr.reduce((r, o) => {
        if (r[o.key]) {
          r[o.key].value += o.value;
        } else {
          r[o.key] = { key: o.someKey, value: o.value };
        }
        return r;
      }, {});
    }

console.log(merge(arrayOne, 'someKey'))

Случай 2:

var arrayTwo = [{ someKeyY: '22', valueZ: 345 }, { someKeyY: '22', valueZ: 543 }]

    function merge(arr, key) {
        return arr.reduce((r, o) => {
            if (r[o.key]) {
              r[o.key].valueZ += o.valueZ;
            } else {
              r[o.key] = { key: o.someKeyY, valueZ: o.valueZ };
            }
            return r;
          }, {});
        }

    console.log(merge(arrayTwo, 'someKeyY'))

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

3 ответа

  1. Объединить все:

    var arrayTwo = [{ someKeyY: '22', valueZ: 345 }, { someKeyY: '22', valueZ: 543 }]
    
    function merge(arr) {
         return arr.reduce((obj, newobj) => {
            for(key in newobj){
              obj[key]=obj[key]||0;
              obj[key]+=newobj[key];
            }
          return obj;
        },{});
        }
    
    console.log(merge(arrayTwo))
    

    Объединить только определенные значения:

    function merge(arr,keys) {
         return arr.reduce((obj, newobj) => {
            for(key in keys){
              obj[key]=obj[key]||0;
              if(newobj[key]){//prevent crashing
              obj[key]+=newobj[key];
              }
            }
          return obj;
        },{});
        }
    
    console.log(merge(arrayTwo,["someKeyY","valueZ"]))
    
  2. Можно valueтакже передать в качестве параметра универсальной функции, и она может возвращать фактический объединенный массив вместо карты.

    function merge(arr, key, value) {
        var result = arr.reduce((r, o) => {
            if (r[o[key]]) { //key = someKey, o[key] = 22
                r[o[key]][value] += o[value];
            } else {
                r[o[key]] = o;
            }
            return r;
        }, {});
        return Object.values(result);
    }
    
    var arrayOne = [{ someKey: '22', value: 345 }, { someKey: '22', value: 543 }, { someKey: '23', value: 666 }];
    
    console.log(merge(arrayOne, 'someKey', 'value'));
    
    var arrayTwo = [{ someKeyY: '22', valueZ: 345 }, { someKeyY: '22', valueZ: 543 }, { someKeyY: '23', valueZ: 666 }];
    
    console.log(merge(arrayTwo, 'someKeyY', 'valueZ'));

  3. Из того, что я понимаю, вы хотите передать следующие аргументы

    function (arrayToMerge, mergeKey, sumKey, objKeyVal)
    

    Вы можете использовать чистые алгоритмы JavaScript и сделать что-то вроде этого:

    var arr = [{ categoryID: 'A', timestamp: '1', name: 'Name', real: 10 }, { categoryID: 'B', timestamp: '1', name: 'Name', real: 10 }, { categoryID: 'B', timestamp: '1', name: 'Name', real: 10 }]
    
    function mergeCats(categories) {
      return categories.reduce((r, o) => {
        if (r[o.categoryID]) {
          r[o.categoryID].real += o.real;
        } else {
          r[o.categoryID] = { timestamp: o.timestamp, real: o.real, categoryID: o.categoryID, name: o.name };
        }
        return r;
      }, {});
    }
    
    console.log('merge', mergeCats(arr))
    
    function masterMerger(a, b, c, d) {
      return a.reduce((r, o) => {
        if (r[o[b]]) {
          r[o[b]][c] += o[c];
        } else {
          const obj = {};
          for (let i = 0; i < d.length; i += 1) {
            obj[d[i]] = o[d[i]]
          }
          r[o[b]] = obj;
        }
        return r;
      }, {})
    }
    
    console.log('merge 2', masterMerger(arr, 'categoryID', 'real', ['timestamp', 'real', 'categoryID', 'name']))

    после этого как раз используйте masterMerger

    masterMerget(arrayToMerge, mergeKey, sumKey, objKeyVal)