【问题标题】:Looking for a pure Javascript Functional programming solution寻找纯 Javascript 函数式编程解决方案
【发布时间】: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


【解决方案1】:

您可以使用 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
        };
    }
    

亲自查看在线演示:http://bit.ly/1IawqzD

【讨论】:

  • 我非常喜欢 Ramda。我在向 Javascript 开发者解释函数式编程时谈到它
  • 我不喜欢 Ramda,但它是我们拥有的最不坏的函数库。
  • 在 JavaScript 的信任中,我认为它做得很好。
猜你喜欢
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 2017-07-27
相关资源
最近更新 更多