繁体   English   中英

重新创建JavaScript的reduce函数

[英]Recreating JavaScript's reduce function

我试图重新创建reduce方法,但将其作为原始函数。

这帮助我了解了很多,但我有一个小问题: 如何重新创建Underscore.js _.reduce方法? 当我插入数组时,它可以正常工作,但是对象不起作用。 我不确定。 我很乐意就应该改变的建议。 我评论了我认为应该更改的地方,但是我很困惑我需要将其更改为什么。 我还创建了自己的每个函数。

您可以在这里找到我的代码: 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

正如@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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM