0

给定一个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's 键来迭代data和查找值。

4

3 回答 3

1

你可以这样做:

for (i = 0; i < data.length; i++) {
    if (chars.indexOf(data[i].item) != -1) {
        // Do something
    } else {
        // Do something else
    }
}

但是,如果chars很大,我会创建一个对象,其键是chars和 use的元素if (chars_obj[data[i].item])。这比每次都搜索一个数组更有效。

于 2013-07-20T22:38:13.180 回答
1

简化代码的另一种方法是将其封装并抽象到一个接受回调的实用程序中,而不是在需要时重用它,如下所示:

// 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) {
于 2013-07-20T23:00:46.460 回答
0

由于您标记了您的问题 jquery,您可以使用 jquery 解决方案:

$.each(chars, function (cndx, chr) {
    $.each(data, function (dndx, datum) {
        if (datum.item === chr) {
            // do my stuff;
        } else {
            /* do something else */
        }
    }
});

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

于 2013-07-20T22:40:06.833 回答