如何简化嵌套循环和条件

How to simplify nested loops and conditions?

本文关键字:条件 嵌套循环 何简化      更新时间:2023-09-26

给定如下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 */
        }
    }
});

不再简洁,但至少你不必索引。