【发布时间】:2015-05-04 22:34:43
【问题描述】:
我一直在挑战自己以纯函数式编程风格解决这个问题,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}]}
]
这里的目标是找到尽可能纯粹的函数式编程解决方案。
这里是my solution
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”。
谢谢!
【问题讨论】:
-
链接指向输出,而不是您的解决方案。输出不是“功能性的”。代码是。
-
您应该直接将相关代码粘贴到问题中,而不仅仅是指向它的链接。也许链接的站点(不再)无法访问,然后问题无法回答或根本没有意义:)
-
将链接更改为指向代码。
-
我不认为 isDividedByTwo 是一个单独的函数。它应该被称为 isEven 并且可以简单地称为
return !(val%2),因为该名称暗示它将返回一个布尔值。 -
@RobG 就像我说的,您可以返回谓词或哈希函数。例如,如果您想按
%3的结果进行分组怎么办?它不适用于true/false。至少不适用于此解决方案。我同意函数名称具有误导性。
标签: javascript functional-programming