重新创建JavaScript';s归约函数

重新创建JavaScript';s归约函数,javascript,function,underscore.js,reduce,Javascript,Function,Underscore.js,Reduce,我正在尝试重新创建reduce方法,但是作为原始函数 这帮助我了解了很多,但我有一个小问题: 当我插入数组时,它工作正常,但对象不工作。我没有定义。如果您能给我一些建议,我将不胜感激。我评论了我认为应该改变的地方,但我不清楚我到底需要改变什么。我还创建了自己的每个函数 您可以在此处找到我的代码: 任何建议都会非常有用。谢谢 这就是我到目前为止所做的: var myArray=[1,2,3,4,5]; var myObject={ num1:1, num2:2, num3:3 };

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

这帮助我了解了很多,但我有一个小问题: 当我插入数组时,它工作正常,但对象不工作。我没有定义。如果您能给我一些建议,我将不胜感激。我评论了我认为应该改变的地方,但我不清楚我到底需要改变什么。我还创建了自己的每个函数

您可以在此处找到我的代码:

任何建议都会非常有用。谢谢

这就是我到目前为止所做的:

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
var myArray=[1,2,3,4,5];
变位肌体={
num1:1,
num2:2,
num3:3
};
每个函数(集合、回调){
if(数组.isArray(集合)){

对于@Yeldar Kurmangaliyev指出的(var i=0,l=collection.length;i),您需要更改以下内容:

if(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
var myArray=[1,2,3,4,5];
变位肌体={
num1:1,
num2:2,
num3:3
};
每个函数(集合、回调){
if(数组.isArray(集合)){

对于(var i=0,l=collection.length;iFWIW,MDN已经-可能能够从中得到一些想法。
if(collection==“object”)
从来都不是真的。它不应该是
typeof(collection==“object”)
?是的,你完全正确。有人告诉我在制作each函数时使用类型of,因为它不是必需的LOL。谢谢!如果你想创建
数组。原型。从头开始减少
,你不需要将键(
I
prop
)传递到
each
中的回调吗(作为学习练习)那么我建议你按照
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