0

说我们有

var i = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

并希望reduce()它喜欢

var plus = function(a, b)
{
  return a + b;
};

var s = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  .reduce(plus);

console.log(s);

现在,我想reduce()从函数中组合函数本身map()

你会怎么做?最聪明的方法是什么?

编辑:

在评论和答案中,许多人声称fold/reduce可以在浅层次上组成映射,这可能是正确的,但是,在范畴论中,从根本上减少/折叠被推广到变态,它都是关于函子map),它被称为F-代数

https://en.wikipedia.org/wiki/Catamorphism

https://en.wikipedia.org/wiki/F-algebra

4

2 回答 2

1

如果您尝试使用 reduce 构建 map 函数,您可以执行以下操作(我提供的示例将使用内置函数并且仅适用于数组!):

var numbers = [1,2,3,4,5];
var map = function(arr, callback) {
  return arr.reduce(function(start, value) {
    start.push(callback(value));
    return start;
  }, []);
};

var newArray = map(numbers, function(value) {
  return value * 3;
});
console.log(newArray); // prints [3,6,9,12,15]

这将遍历我们的 numbers 数组中的每个值,使用我们正在循环的当前值调用(执行)回调函数,然后将此值推送到一个空数组,该数组将在 reduce 结束时返回。换句话说,它将我们的回调函数的结果映射到一个新数组!

话虽如此,如果您对函数式编程感兴趣,我鼓励您查看underscorejs 的注释源代码

于 2015-01-07T02:52:10.460 回答
1

map为数组中的每个值返回一个值,因此结果将是一个与输入数组一样大的数组。从中获取一个值的唯一方法是只向其中发送一个值。

[[1,2,3,4,54]].map(
    function(d){
        sum = d.reduce(function(s,d){
                     return s+d
                 });
        console.log(sum)
    }
);
于 2015-01-07T07:15:21.863 回答