我一直在用Javascript
中的纯函数式编程风格来解决这个问题。
问题是:
输入:
var src = [{n:3, x:2}, {n:6, x:1}, {n:2, x:0}, {n:10, x:5}, {n:5, x:2}, {n:1, x:44}];
问题定义:
使用谓词或散列函数对src
数组中的项进行分组,并将每个组的item.x
值相加。
例如,在我粘贴的输出中,分组是item.n
的余数除以2
输出:
var trgt = [
{sum:48, items: [{n:3, x:2}, {n:5, x:2}, {n:1, x:44}]},
{sum:6, items: [{n:6, x:1}, {n:2, x:0}, {n:10, x:5}]}
]
这里的目标是尽可能找到纯粹的函数式编程解决方案。
function moduloTwo(val) {
return (val.n % 2);
}
function makeObjectAndAdd(hashFn) {
return function (result, curr) {
if (result[hashFn(curr)] === undefined) {
result[hashFn(curr)] = {sum: 0, items: []};
}
var newObj = result[hashFn(curr)];
newObj.items.push(curr);
newObj.sum += curr.x;
return result;
};
}
var result = src.reduce(makeObjectAndAdd(moduloTwo), {});
我觉得可以让它更“functional
”。
谢谢!
答案 0 :(得分:2)
您可以使用Ramda.js在函数上编写代码,如下所示:
给出一个输入:
var input = [
{ n: 3, x: 2 },
{ n: 6, x: 1 },
{ n: 2, x: 0 },
{ n: 10, x: 5 },
{ n: 5, x: 2 },
{ n: 1, x: 44 }
];
我们首先根据属性n
将它们分成奇数和偶数组:
var oddN = R.compose(odd, R.prop("n"));
var groups = R.groupBy(oddN, input);
function odd(n) {
return n % 2 === 1;
}
然后我们获取所有组的值,获取每个项目的x
属性并汇总:
var output = R.map(count, R.values(groups));
function count(items) {
return {
sum: R.sum(R.pluck("x", items)),
items: items
};
}
请亲自查看在线演示:http://bit.ly/1IawqzD