编码从头开始从_underscore.js找到

时间:2015-09-16 01:42:45

标签: javascript arrays find underscore.js

作为高阶函数的练习,我试图从头开始编写整个下划线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);
};

任何想法?

1 个答案:

答案 0 :(得分:1)

经过一番思考后编辑:开始时,因为startValueundefinedstartValue = element(即数组的第一个元素)。之后,您的回调被调用,但由于previous不是undefined(实际上是数组中的第一个元素),它返回previous(第一个元素)数组)。

此外,请注意,如果您的回调曾返回undefined,则您的reduce会做错事。如果未提供起始值,则应调用callback并从循环外的第二个元素开始,或在索引为0的循环中触发此行为。