【问题标题】:JavaScript: Writing a reduce function, trouble with callback function that subtracts valuesJavaScript:编写reduce函数,减去值的回调函数有问题
【发布时间】:2016-09-25 03:36:52
【问题描述】:

我正在努力解决 JavaScript 中的代码挑战,我的任务是创建一个名为 reduce 的函数,该函数会将集合缩减为一个值,该值是对我在其上的每个项目调用函数的累积结果已经迭代了。要包含的三个参数是数组、回调和开始。 Start 是开始的索引,如果没有作为参数提供,则默认为索引零。

以下是我目前拥有的:

function reduce(array, callback, start) {
    if(typeof start === 'number'){
        var initVal = start;
    } else {
        var initVal = 0;
    }
    return array.reduce(callback, initVal);
}

我有一些测试可以用来测试我的解决方案,而我目前的工作只有一个测试失败,其中涉及一个减去值的回调函数。这是我目前失败的测试:

var difference = function(tally, item) {return tally - item; };
var total = reduce([1, 2, 3], difference);
expect(total).to.equal(-4);

非常感谢您的指导。


编辑添加工作解决方案:

function reduce(array, callback, start) {
    if( typeof start === 'undefined' ){
        return array.reduce(callback);
    } else {
        return array.reduce(callback, start);
    }
}

【问题讨论】:

  • 我认为你不应该使用Array.prototype.reduce,而是手动迭代数组。是什么让我这么想:start 是您解释的索引开始,而不是初始值。
  • 你将初始值设置为0,而不是索引0处的项目,所以你得到0 - 1 - 2 - 3 == -6

标签: javascript arrays reduce


【解决方案1】:

您的代码不起作用,因为您误用了 start,该 start 旨在作为以初始值开头的元素索引。

所以对于 [1, 2, 3] 数组作为输入和减法函数作为回调,你得到的是:

  1. reducer 累加器初始化为0(实际上你不应该这样做)
  2. 0 - 1 -> -1
  3. -1 - 2 -> -3
  4. -3 - 3 -> -6

你应该做的事情是:

  1. 没有传递第三个参数,因此您从数组的开头进行迭代。
  2. 累加器没有显式初始化,所以第一个元素被传递给它,因此acc = 1
  3. 1 - 2 -> -1
  4. -1 - 3 -> -4

【讨论】:

  • 我认为期待-4 是不应该做的奇怪的事情......
  • @Bergi [1, 2, 3].reduce((acc, v) => acc - v) // -4 ?但我同意,reduce/fold 函数必须将初始值作为强制参数。
  • 是的,当然可以,我认为他应该更改测试而不是 imo 正确的实现(foldr 优于 foldr1)。
  • 检查启动参数是否存在的正确逻辑是什么?
  • @campallison 正如我在评论中提到的 - 你应该WITHOUT使用内置的reduce函数来实现它,只需使用一个循环。
猜你喜欢
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多