1

私は次のJavaScriptコードを持っています:

    var postcodes = [['BD1',8],['BD2',20],['BD7',30]];

    var rangeColours = [['red',10],['black',20],['blue',30]];

    var postcodeColours = [];

    for(var i=0; i<postcodes.length; i++) {
        var match = 0;
        for(var x=0; x<rangeColours.length; x++) {
            if(postcodes[i][1] <= rangeColours[x][1] && match == 0){
                postcodeColours.push([postcodes[i][0],rangeColours[x][0]]);
                match = 1;
            } 
        }   
    }

コードの出力は次のとおりです:(ちなみにこれで問題ありません)

    [BD1,red][BD2,black][BD7,blue]

特に2番目のforループで発生する無駄なルックアップを減らすことに関して、コードをより効率的にする方法があるかどうか知りたいですか?現時点では、「match」変数を使用しており、postcodes配列要素の値がrangeColours配列要素の値よりも小さい場合は、1に設定して、各postcodes配列要素に対してプッシュが繰り返されないようにします。これを行うためのよりエレガントな方法はありますか?

どうもありがとう

4

4 に答える 4

4

ルックアップを本当に最適化したい場合は、ローカルにスタッシュすることで、ループ本体内の冗長なルックアップを削除できますpostcodes[i]rangeColours[x]

for(var i=0; i<postcodes.length; i++) {
    var postcodeCurrent = postcodes[i];
    var match = 0;
    for(var x=0; x<rangeColours.length; x++) {
        var rangeColourCurrent = rangeColours[x];
        if(postcodesCurrent[1] <= rangeColoursCurrent[1] && match == 0){
            postcodeColours.push([postcodesCurrent[0],rangeColoursCurrent[0]]);
            match = 1;
        } 
    }   
}

ただし、これがパフォーマンスに顕著な影響を与えるかどうかはわかりません。それはマイクロ最適化のように感じます。

于 2012-05-08T20:34:47.257 に答える
2

breakステートメントを使用する

for(var i=0; i<postcodes.length; i++) {
    for(var x=0; x<rangeColours.length; x++) {
        if(postcodes[i][1] <= rangeColours[x][1]){
            postcodeColours.push([postcodes[i][0],rangeColours[x][0]]);
            break;
        } 
    }   
}
于 2012-05-08T20:36:11.170 に答える
1

あなたは確かにこのようなことをすることができます:

for(var i=0; i<postcodes.length; i++) {
    var match = 0,
        codes = postcodes[i],
        coloursLength = rangeColours.length;
    for(var x=0; x<coloursLength; x++) {
        var colours = rangeColours[x];
        if(codes[1] <= colours[x][1] && match == 0){
            postcodeColours.push(codes[0], colours[0]);
            match = 1;
        }
    }
}
于 2012-05-08T20:35:36.600 に答える
0

match変数またはを使用するのではなく、一致するものが見つかったらbreakの値を設定できます。x

for(var i=0; i<postcodes.length; i++) {
    for(var x=0; x < rangeColours.length; x++){
        if(postcodes[i][1] <= rangeColours[x][1]){
            postcodeColours.push([postcodes[i][0],rangeColours[x][0]]);
            x = rangeColours.length;
        }  
    }
}
于 2012-05-08T20:51:18.100 に答える