。没有累加器的减少

时间:2015-03-30 23:46:43

标签: javascript iterator underscore.js reduce

对此有很多麻烦,我迫切希望朝着正确的方向前进。

尝试通过编写reduce函数来完成常见的Underbar(基本上是Underscore)练习。它必须满足四个测试:

  1. 应该能够总结一个数组
  2. 当没有给出时,应使用第一个元素作为累加器
  3. 当给定累加器时,应该在第一个元素上涉及迭代器
  4. 在将第一个元素用作累加器时,不应调用第一个元素上的迭代器
  5. 这告诉我,有两种基本情况:

    1. 给出了累加器,使得累加器!=未定义,此时你可以使用.each来满足测试1和3,因为你要经历所有值,从(累加器,集合[0])开始,然后(集合[0],集合[1]),等等。或者那是我的想法;我可以离开。

      if (accumulator != undefined) {
        _.each(collection, function(value) {
          accumulator = iterator(accumulator, value);
        });
      }
      return accumulator; 
      
    2. 测试2和4仍然失败,因为没有给出累加器,在那时,我迷路了。我不认为。每个都可以使用。基本上我必须告诉这个从集合[0]开始并迭代其余部分,但我完全迷失了。我对编码仍然很陌生,其中很多还没有完全融入其中。

    3. 我们非常感谢您提供的任何帮助。如果我对这些功能的工作原理有误,请随时纠正。我只是在寻求帮助。

2 个答案:

答案 0 :(得分:0)

以下代码应该完成这项工作。

Array.prototype.reduce = function(callback, accumulator){
	var needsAccum = arguments.length <2;
	if (this.length === 0){
		return this;
	}
	this.forEach(function(item){
		if (needsAccum){
			accumulator = item;
			needsAccum = false;
		}
		else{
			accumulator = callback(accumulator, item)
		}
	})
	return accumulator;
}

答案 1 :(得分:0)

总结部分问题:

“我如何使用_.each进行迭代,有时我必须跳过第一次迭代” - “不会_.each在每个索引处迭代?”

对我来说,我发现解决办法是在我的_.each

中添加一个if / else语句
_.each(collection, function(value, index) {
  if (accumulator === undefined){
    accumulator = item;
  } else {
    accumulator = iterator(accumulator, value);
  }
}

基本上,将if语句放在_.each中而不是之前。 在第一次迭代中,如果没有累加器,循环将进入“IF”,并将跳过“ELSE”