我有以下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,如果postcodes数组元素的值小于rangeColours数组元素的值,以确保每个postcodes数组元素不重复推送,则有更优雅的方式吗?
非常感谢
答案 0 :(得分: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;
}
}
}
我不确定这是否会对性能产生明显的影响。感觉就像一个微优化。
答案 1 :(得分: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;
}
}
}
答案 2 :(得分: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;
}
}
}
答案 3 :(得分: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;
}
}
}