简体   繁体   中英

Passing argument to function that will transform to object assignment

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

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

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

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM