[Object] 的 mergeWith
mergeWith for [Object]
是否有任何推荐的方法或函数将 R.mergeWith 的 fn 功能与 n 个列表项结合起来,例如 R.mergeAll?
我有
const data = [
{ a: 1, b: 2, c: 0, d: { e: 3 }},
{ a: 1, c: -1 },
{ a: 1, b: 4, c: 0, d: { e: 2 }}
]
并希望按键对所有值求和,return
{ a: 3, b: 6, c: -1, d: { e: 5 }}
我试过
R.mapAccum((a, b) => R.mergeWith(R.sum, a, b), {}, data)
(in REPL) 猜想我想要的是一种通过一些 fn 合并前一个和当前对象的方法。
有什么想法可以用功能库以简洁、纯粹的方式做到这一点吗?我更喜欢 Ramda,但任何东西都会很棒。
假设你的对象中没有循环结构,这将解决你的问题。
function merge(array){
// Returns merged array
return mergeSubArray(array);
// This function recursively process all sub-arrays
function mergeSubArray(subArray){
// Sum all properties of all objects in the array
return subArray.reduce(function(previousObject, currentObject){
// Get all properties of an object
Object.keys(currentObject).forEach(function(keyOfCurrentObject){
/*
For all properties we need to check whether this type if number or object.
If we encountered a number, we simply add it to previous sum.
Otherwise, if it is an object, call this function to it.
*/
if(typeof previousObject[keyOfCurrentObject] == 'number'){
previousObject[keyOfCurrentObject] += currentObject[keyOfCurrentObject];
}else{
previousObject[keyOfCurrentObject] = mergeSubArray([previousObject[keyOfCurrentObject], currentObject[keyOfCurrentObject]]);
}
});
// Returns merged objects
return previousObject;
});
}
}
Ramda 当前没有 mergeDeep
或 mergeDeepWith
函数。但它可能很快就会被添加。参见 PR 1867。
有了这个,你可以简单地做
R.reduce(R.mergeDeepWith(R.add), {}, data)
您可以在 REPL 中看到模拟结果。
(您需要使用 add
而不是 sum
,因为 reduce
意味着一次处理一对对象。add
用于两个数字,sum
用于它们的列表。)
是否有任何推荐的方法或函数将 R.mergeWith 的 fn 功能与 n 个列表项结合起来,例如 R.mergeAll?
我有
const data = [
{ a: 1, b: 2, c: 0, d: { e: 3 }},
{ a: 1, c: -1 },
{ a: 1, b: 4, c: 0, d: { e: 2 }}
]
并希望按键对所有值求和,return
{ a: 3, b: 6, c: -1, d: { e: 5 }}
我试过
R.mapAccum((a, b) => R.mergeWith(R.sum, a, b), {}, data)
(in REPL) 猜想我想要的是一种通过一些 fn 合并前一个和当前对象的方法。
有什么想法可以用功能库以简洁、纯粹的方式做到这一点吗?我更喜欢 Ramda,但任何东西都会很棒。
假设你的对象中没有循环结构,这将解决你的问题。
function merge(array){
// Returns merged array
return mergeSubArray(array);
// This function recursively process all sub-arrays
function mergeSubArray(subArray){
// Sum all properties of all objects in the array
return subArray.reduce(function(previousObject, currentObject){
// Get all properties of an object
Object.keys(currentObject).forEach(function(keyOfCurrentObject){
/*
For all properties we need to check whether this type if number or object.
If we encountered a number, we simply add it to previous sum.
Otherwise, if it is an object, call this function to it.
*/
if(typeof previousObject[keyOfCurrentObject] == 'number'){
previousObject[keyOfCurrentObject] += currentObject[keyOfCurrentObject];
}else{
previousObject[keyOfCurrentObject] = mergeSubArray([previousObject[keyOfCurrentObject], currentObject[keyOfCurrentObject]]);
}
});
// Returns merged objects
return previousObject;
});
}
}
Ramda 当前没有 mergeDeep
或 mergeDeepWith
函数。但它可能很快就会被添加。参见 PR 1867。
有了这个,你可以简单地做
R.reduce(R.mergeDeepWith(R.add), {}, data)
您可以在 REPL 中看到模拟结果。
(您需要使用 add
而不是 sum
,因为 reduce
意味着一次处理一对对象。add
用于两个数字,sum
用于它们的列表。)