【问题标题】:Recreating JavaScript's reduce function重新创建 JavaScript 的 reduce 函数
【发布时间】:2016-04-04 07:29:29
【问题描述】:

我正在尝试重新创建 reduce 方法,但作为原始函数。

这帮助我理解了很多,但我有一个小问题: How to re-create Underscore.js _.reduce method? 当我插入数组时,它工作正常,但对象不起作用。我不确定。我会很感激关于我应该改变什么的建议。我评论了我认为应该更改某些内容的地方,但我很困惑我需要将其更改为什么。我还创建了自己的每个函数。

你可以在这里找到我的代码:http://goo.gl/6RU9Bc

任何建议都会非常有帮助。谢谢!!

这是我目前所拥有的:

var myArray=[1,2,3,4,5];

var myObject={
  num1:1,
  num2:2,
  num3:3
};

function each(collection, callback){
  if(Array.isArray(collection)) {
    for(var i=0, l=collection.length; i<l; i++){
      callback(collection[i]); 
    };
  }else if(collection === "object") {
    for(var prop in collection){
       callback(collection[prop]);
    };
  }
}

function multiply(num, num2){
  return num*num2;
}

function reduce(collection, callback, accumulator){
  each(collection, function(element){
    if(accumulator === undefined) {
      return accumulator = element; // is the problem here? Why? I don't understand.
    }else {
      return accumulator = callback(accumulator, element);
    };   
});

return accumulator;
};

console.log(reduce(myArray, multiply)); // 120
console.log(reduce(myArray, multiply, 5)); // 160
console.log(reduce(myObject, multiply)); // returns undefined
console.log(reduce(myObject, multiply, 5)); // returns 5

【问题讨论】:

  • FWIW,MDN 有 a polyfill available - 或许可以从中得到一些想法。
  • if(collection === "object") 永远不会是真的。不应该是typeof(collection) === 'object')吗?
  • 是的,你完全正确。有人告诉我在制作每个功能时使用 typeof,因为它不是必需的 LOL。谢谢!
  • 您不需要将密钥(iprop)传递给each 中的回调吗?
  • 如果您想从头开始创建Array.prototype.reduce(作为学习练习),那么我建议您关注current specification

标签: javascript function underscore.js reduce


【解决方案1】:

正如@Yeldar Kurmangaliyev 所指出的,您需要对此进行更改:

if(collection === "object")

到:

if(typeof(collection) === "object")

这里是固定代码:

var myArray=[1,2,3,4,5];

var myObject={
  num1:1,
  num2:2,
  num3:3
};

function each(collection, callback){
  if(Array.isArray(collection)) {
    for(var i=0, l=collection.length; i<l; i++){
      callback(collection[i]); 
    };
  }else if(typeof(collection) === "object") {
    for(var prop in collection){
       callback(collection[prop]);
    };
  }
}

function multiply(num, num2){
  return num*num2;
}

function reduce(collection, callback, accumulator){
  each(collection, function(element){
    if(accumulator === undefined) {
      return accumulator = element; // is the problem here? Why? I don't understand.
    }else {
      return accumulator = callback(accumulator, element);
    };   
});

return accumulator;
};

console.log(reduce(myArray, multiply)); // 120
console.log(reduce(myArray, multiply, 5)); // 600
console.log(reduce(myObject, multiply)); // 6
console.log(reduce(myObject, multiply, 5)); // 30

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多