0

So Instance I have the following function:

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;
  }, {});
}

And I want to use it 10 times, but every time the { key: o.key, real: o.real } will be different for instance { key: o.key, valueX: o.valueX } etc.. how can I generate this object as function parameter? so If I would run

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

I am a little confused there

Case 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'))

Case 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'))

I want universal function instead of writing the same function over and over and changing only the assignment object...

Ilanus
  • 6,690
  • 5
  • 13
  • 37
  • 1
    please add input and expected output as well. – Nina Scholz Jan 15 '17 at 11:01
  • It's not clear what you're asking; answering @NinaScholz's question above will help a fair bit, but if you can explain more clearly, that would be good too. I suspect [this question's answers](http://stackoverflow.com/questions/4244896/dynamically-access-object-property-using-variable) will help, though, as `o.key` always accesses a property called `"key"`, whereas `o[key]` accesses a property named by the value of the variable `key`. – T.J. Crowder Jan 15 '17 at 11:04
  • I have edited the post @NinaScholz – Ilanus Jan 15 '17 at 11:11

3 Answers3

0

Merge all:

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))

Merge just certain values:

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"]))
Jonas Wilms
  • 132,000
  • 20
  • 149
  • 151
0

You can pass value also as parameter to the generic function and it can return the actual merged array instead of a map.

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'));
Bhabishya Kumar
  • 731
  • 3
  • 7
0

From what I understand, you want to pass the following arguments

function (arrayToMerge, mergeKey, sumKey, objKeyVal)

You can use pure JavaScript algorithms and do something like this:

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']))

then just use the masterMerger

masterMerget(arrayToMerge, mergeKey, sumKey, objKeyVal)
Ilanus
  • 6,690
  • 5
  • 13
  • 37