寻找纯Javascript函数编程解决方案

时间:2014-12-03 07:24:43

标签: javascript functional-programming

我一直在用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”。

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用Ramda.js在函数上编写代码,如下所示:

  1. 给出一个输入:

    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 }
    ];
    
  2. 我们首先根据属性n将它们分成奇数和偶数组:

    var oddN = R.compose(odd, R.prop("n"));
    
    var groups = R.groupBy(oddN, input);
    
    function odd(n) {
        return n % 2 === 1;
    }
    
  3. 然后我们获取所有组的值,获取每个项目的x属性并汇总:

    var output = R.map(count, R.values(groups));
    
    function count(items) {
        return {
            sum:   R.sum(R.pluck("x", items)),
            items: items
        };
    }
    
  4. 请亲自查看在线演示:http://bit.ly/1IawqzD