Javascript 返回值时,“each”与“for loop”有何不同?
我有我的Javascript 返回值时,“each”与“for loop”有何不同?,javascript,functional-programming,find,each,Javascript,Functional Programming,Find,Each,我有我的each函数,我创建该函数是为了模仿underline.js的\u each()来学习Javascript var each = function(list, iteratee) { if (Array.isArray(list)) { // list is array for (var i = 0; i < list.length; i++) { iteratee(list[i], i, list); } }
each
函数,我创建该函数是为了模仿underline.js的\u each()
来学习Javascript
var each = function(list, iteratee) {
if (Array.isArray(list)) { // list is array
for (var i = 0; i < list.length; i++) {
iteratee(list[i], i, list);
}
} else if (list.constructor === Object) { // list is object
for (var key in list) {
iteratee(list[key], key, list);
}
}
};
我认为它会在找到通过外部谓词函数测试的元素的真值后立即返回一个值。但是相反,它给了我一个未定义的
下面的代码按照我的预期工作。但为什么它们会提供不同的输出
var find = function(list, predicate) {
if (Array.isArray(list)) { // list is array
for (var i = 0; i < list.length; i++) {
if (predicate(list[i])) {
return list[i];
}
}
} else if (list.constructor === Object) { // list is object
for (var key in list) {
if (predicate(list[key])) {
return list[key];
}
}
}
};
var find=函数(列表,谓词){
如果(Array.isArray(list)){//list是数组
对于(变量i=0;i
我不明白的是,为什么当我将每个
都包含在我的查找
函数中时,它们不能像我所期望的那样工作。难道他们的表达方式不一样吗?换句话说,一个是函数式,另一个不是?这是由于缺少return语句造成的。
每个函数迭代find,但不返回任何内容。谓词中的return语句将输出返回到不需要的每个函数
工作功能示例:
var find = function(list, predicate) {
var res = undefined/null/whatever;
each(list, function(elem) {
if (predicate(elem)) {
res = elem;
}
});
return res;
};
但是,此函数效率不高,因为它在找到结果时不会停止这与返回
的工作方式有关。让我们看看您的代码:
var find = function(list, predicate) {
// you pass list and an anonymous callback to `each`
each(list, function (elem) {
// if this condition is true
if (predicate(elem)) {
// return elem
return elem;
}
});
}
问题是returnelem
应用于匿名回调,而不是find
函数
如果希望能够“中断”每个循环,可以在每个中检查for循环每次迭代的当前状态
// only going to write for arrays
var each = function (list, iteratee) {
for (var i = 0; i < list.length; i++) {
if (iteratee(list[i], i, list)) continue;
else break;
}
});
// then in find:
var find = function (list, predicate) {
var ret = null
each(list, function(elem) {
if (predicate(elem)) {
ret = elem;
return false; // return false, since we no longer wish to continue
}
});
return ret;
};
这个解决方案唯一的问题是它扭曲了每个
的含义每个
直观地表示“完成所有事情”,而第二个解决方案不一定能做到这一点。谢谢。我也在寻找一种方法,让它在找到答案时停止迭代。非常感谢。“我能看到发生了什么。”凯莱克我补充了第二个解决方案。我不确定我是否会建议使用它,但它仍然有效。非常有洞察力。非常感谢你@KyleC你的问题让我想起了我以前见过的一个问题(因为你使用了谓词
)
// only going to write for arrays
var each = function (list, iteratee) {
for (var i = 0; i < list.length; i++) {
if (iteratee(list[i], i, list)) continue;
else break;
}
});
// then in find:
var find = function (list, predicate) {
var ret = null
each(list, function(elem) {
if (predicate(elem)) {
ret = elem;
return false; // return false, since we no longer wish to continue
}
});
return ret;
};
var each = function (list, iteratee) {
for (var i = 0; i < list.length; i++) {
if (iteratee(list[i], i, list)) {
continue;
} else {
return list[i];
}
}
// didn't find anything, so `return null`
return null;
});
var find = function (list, predicate) {
return each(list, function(elem) {
// if `predicate`, return false, so the loop breaks
return !predicate(elem);
});
};