作为高阶函数的练习,我试图从头开始编写整个下划线JS库。我被困在以下
var find = function(array, predicate) {
return reduce(array, function (previous,current) {
if (previous !== undefined) {
return previous;
}
else if (predicate(current) === true)
{return current};
}, undefined)
}
我的forEach和reduce函数:
var forEach = function(collection, callback) {
if (Array.isArray(collection)) {
for (var i = 0; i < collection.length; i++)
callback(collection[i], i, collection);
}
else {
for (var i in collection) {
callback(collection[i], i, collection);
}
}
};
var reduce = function(collection, callback, startValue) {
forEach(collection, function (element) {
if (startValue !== undefined) {
startValue = callback(startValue, element);
}
else {
startValue = element;
}
});
return startValue;
}
我使用以下谓词函数进行测试:
var isOdd = function(x) {
if (x%2 === 1) {
return true
}
else {
return false;
}
};
你会看到函数find返回数组中的第一个值而不是数组中的第一个奇数。
最有趣的是,当我用原始的arr.reduce函数编写函数时,如下所示:
var finder = function(arr, test){
return arr.reduce(function(memo, curr){
if (memo === undefined){
if (test(curr)){return curr;}
}
return memo;
},undefined);
};
任何想法?
答案 0 :(得分:1)
经过一番思考后编辑:开始时,因为startValue
是undefined
,startValue = element
(即数组的第一个元素)。之后,您的回调被调用,但由于previous
不是undefined
(实际上是数组中的第一个元素),它返回previous
(第一个元素)数组)。
此外,请注意,如果您的回调曾返回undefined
,则您的reduce
会做错事。如果未提供起始值,则应调用callback并从循环外的第二个元素开始,或在索引为0
的循环中触发此行为。