作为一个exericse的一部分,我重写了下划线函数并在jsfiddle中测试它们。每次我传递一个回调函数,我都会得到" undefined"。
我的代码如下:
each = function(collection, iterator) {
if(Array.isArray(collection)){
for (var i = 0; i < collection.length; i++) {
iterator(collection[i], i, collection);
}
} else {
for(var key in collection) {
iterator(collection[key], key, collection);
}
}
};
var numbers = [1,2,3,4];
var result = each(numbers, function(num) {
return num * 2;
});
console.log(result);
// undefined
知道我做错了什么以及为什么它没有输出到jsfiddle上?
答案 0 :(得分:0)
您没有聚合操作的结果,这就是结果不是结果的原因。
以下是对如何修复数组的快速准备。
each = function(collection, iterator) {
var arr = [];
if(Array.isArray(collection)){
for (var i = 0; i < collection.length; i++) {
arr.push( iterator(collection[i], i, collection) );
}
return arr;
} else {
for(var key in collection) {
iterator(collection[key], key, collection);
}
}
};
var numbers = [1,2,3,4];
var result = each(numbers, function(num) {
return num * 2;
});
console.log(result);
答案 1 :(得分:0)
你没有做错任何事。您的each
功能不会返回任何内容。这很好,因为each
函数不一定要返回任何东西。您可能正在考虑map
或reduce
函数的行,该函数编译对集合中每个项目调用回调的结果,然后返回该编译。
您传递给each
函数的回调通常不返回任何内容。想象一下each
喜欢它只是正常for
循环的语法糖; for
循环不返回任何内容(显然是......),它们只是对集合中的项以及已在包含范围内声明的变量执行泛型操作。
话虽如此,如果您想模拟下划线(或任何好的库),您将需要返回该集合以启用链接。来自underscore docs:
[each]迭代一个元素列表,依次产生一个iteratee函数....返回链接列表。
这只是一个很好的做法,以避免让可能使用您的库的开发人员烦恼,并且习惯于能够在JavaScript中链接所有内容。
所以你需要做的就是把
return collection;
在each
功能结束时,你很好。欢呼声。