javascript-返回值时,“每个”与“循环”有何不同?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-返回值时,“每个”与“循环”有何不同?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2536字,纯文字阅读大概需要4分钟。
内容图文
![javascript-返回值时,“每个”与“循环”有何不同?](/upload/InfoBanner/zyjiaocheng/662/63285efd09d548d4b6d206068a8a2d37.jpg)
我有我创建的每个函数,用于模拟Java学习的Underscore.js的_each().
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);
}
}
};
然后,我想创建一个功能查找,该功能也可以从Underscore.js获得.此函数通过列表中的每个值进行查找,返回第一个通过真值测试(谓词)的值,或者
如果没有值通过测试,则为undefined.该函数在找到可接受的元素并且不遍历整个列表时立即返回.
这是我提出的find版本.
var find = function(list, predicate) {
each(list, function(elem){
if (predicate(elem)) {
return elem;
}
});
};
我认为在找到通过外部谓词功能通过测试的元素的真值后,它将立即返回一个值.但是,它给了我一个不确定的信息.
下面的代码按我的预期工作.但是为什么它们会提供不同的输出?
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];
}
}
}
};
我不明白的是,为什么当我将其包含在find函数中时,它们每个都不如我预期的那样工作.他们会不会只是在表达方式上有所不同?换句话说,一种是功能样式,另一种不是?
解决方法:
这与收益如何运作有关.让我们看看您的代码:
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;
}
});
}
问题在于return elem适用于匿名回调,而不适用于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;
};
第二种解决方案是从每个循环中返回:
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);
});
};
我对这个解决方案唯一的问题是,它扭曲了每个解决方案的含义.每个直观地表示“遍历一切”,而第二种解决方案则不一定.
内容总结
以上是互联网集市为您收集整理的javascript-返回值时,“每个”与“循环”有何不同?全部内容,希望文章能够帮你解决javascript-返回值时,“每个”与“循环”有何不同?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。