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]

我想知道是否有办法让代码更高效,尤其是在减少第二个 for 循环中发生的浪费查找方面?目前我正在使用“匹配”变量并将其设置为 1,如果邮政编码数组元素的值小于 rangeColours 数组元素的值,以确保推送不会针对每个邮政编码数组元素重复,是有更优雅的方法吗?

非常感谢

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变量 or 。breakx

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 回答