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.