gpt4 book ai didi

javascript - 从头开始从 _underscore.js 编码查找

转载 作者:行者123 更新时间:2023-12-03 08:53:31 24 4
gpt4 key购买 nike

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

有什么想法吗?

最佳答案

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

另外,请注意,如果您的回调返回 undefined,您的 reduce 将会执行错误的操作。如果未提供起始值,您应该调用回调并从循环外部的第二个元素开始,或者在索引为 0 的循环中触发此行为。

关于javascript - 从头开始从 _underscore.js 编码查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32598401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com