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ネストされたループと内部条件ではなく、それを表現するためのより簡単な構文はありますか?

2 つのデータセットを一致させようとしています。より正確には、charsのキーを使用して反復dataして値を見つけようとしています。

4

3 に答える 3

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 に答える
1

あなたはこれを行うことができます:

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

ただし、 が大きい場合は、キーがand usecharsの要素であるオブジェクトを作成します。これは、配列を毎回検索するよりも効率的です。charsif (chars_obj[data[i].item])

于 2013-07-20T22:38:13.180 に答える
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 に答える