如何简化嵌套循环和条件
How to simplify nested loops and conditions?
给定如下JS:
for (c in chars) {
for (i in data) {
if (data[i].item === chars[c]) {
// do my stuff;
}
else { /* do something else */}
}
}
以及等数据
var chars = [ 'A', 'B', 'C', 'A', 'C' ];
var data = [
{'item':'A', 'rank': '1'},
{'item':'B', 'rank': '2'},
{'item':'C', 'rank': '3'}
// no duplicate
];
有没有比嵌套的for
循环和内部条件更简单的语法来表达这一点?
我尝试匹配两个数据集,更准确地说是使用chars
的键来迭代data
并查找值。
您可以这样做:
for (i = 0; i < data.length; i++) {
if (chars.indexOf(data[i].item) != -1) {
// Do something
} else {
// Do something else
}
}
但是,如果chars
很大,我会创建一个对象,其键是chars
的元素,并使用if (chars_obj[data[i].item])
。这比每次搜索一个数组更有效。
简化代码的另一种选择是将代码封装并抽象为一个接受回调的实用程序,而不是在需要时重用它,比如:
// definition
function eachChar(onMatch, onMismatch) {
for (c in chars) {
for (i in data) {
if (data[i].item === chars[c]) {
typeof onMatch === 'function' && onMatch();
} else {
typeof onMismatch === 'function' && onMismatch();
}
}
}
}
// usage examples
eachChar(function() {
// do something when it's a match
});
eachChar(function() {
// do something when it's a match
}, function() {
// do something else when it's not
});
请在jsFiddle上查看实时演示。
附带说明一下,您可能希望显式声明用作循环索引的变量,以免在外部作用域(例如全局作用域)中暴露它们:
// that:
for (c in chars) {
for (i in data) {
// would become this:
for (var c in chars) {
for (var i in data) {
由于您将问题标记为jquery,因此可以使用jquery解决方案:
$.each(chars, function (cndx, chr) {
$.each(data, function (dndx, datum) {
if (datum.item === chr) {
// do my stuff;
} else {
/* do something else */
}
}
});
不再简洁,但至少你不必索引。
相关文章:
- Knockout.js中带有if:子句的嵌套循环
- 有没有一种方法可以在所有嵌套循环之后放置一个标签,以便在一步中将它们全部打断
- JavaScript:在嵌套循环中为数组赋值
- Javascript嵌套循环匹配、组合、替换
- 在嵌套循环中处理 AJAX (Angularjs)
- knockout.js中的嵌套循环
- 在二维数组中搜索比嵌套循环更有效的方法
- 用于动态创建对象的嵌套循环
- 在javascript中嵌套循环
- JavaScript中的嵌入循环和嵌套循环之间有区别吗
- 嵌套循环中数组2d中的javascript变量丢失
- 嵌套循环javascript棋盘
- jQuery嵌套循环nextUntil选择器
- 如何使用嵌套循环使用 Javascript 打印到外部循环的输出中
- 如何在 Javascript 中创建一个模拟 100 行和 10 列网格的嵌套循环
- 如何避免嵌套循环
- 嵌套循环以添加数字
- 嵌套循环问题
- 嵌套循环中 Javascript 变量的作用域
- 如何简化嵌套循环和条件