作为努力的一部分,我正在重写下划线函数,并在jsfiddle中测试它们。每次传递回调函数时,我都会得到“未定义”。
我的代码如下:
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你知道我做错了什么吗?为什么它不放小提琴?
发布于 2016-02-26 05:45:31
你没做错什么。您的each函数没有返回任何内容。这很好,因为each函数不一定要返回任何内容。您可能会按照map或reduce函数的思路进行思考,后者编译对集合中的每个项调用回调的结果,然后返回该编译。
传递给each函数的回调通常不会返回任何内容。将each看作是普通for循环的语法糖;for循环不返回任何内容(显然.),它们只对集合中的项和包含范围中声明的变量执行泛型操作。
尽管如此,如果您想要模拟下划线(或任何好的库),您将希望返回集合以启用链接。来自下划线文档
每个元素在一个元素列表上迭代,依次生成一个迭代器( iteratee function....Returns )用于链接的列表。
这只是一个很好的实践,这样可以避免困扰那些可能使用您的库并习惯于在JavaScript中链接所有东西的开发人员。
所以你要做的就是
return collection;在你的each函数的末尾,你很好。干杯。
发布于 2016-02-26 05:27:43
您没有聚合操作的结果,这就是结果不是结果的原因。
下面是如何为数组修复这个问题的快速尝试。
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);https://stackoverflow.com/questions/35644040
复制相似问题