Javascript 优化循环,避免浪费查找
我有以下JavaScript代码:Javascript 优化循环,避免浪费查找,javascript,for-loop,Javascript,For Loop,我有以下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 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;
}
}
}
我想知道是否有办法使代码更有效,特别是在减少第二个for循环中出现的浪费性查找方面?目前,我正在使用match变量,如果postcodes数组元素的值小于rangecolors数组元素的值,则将其设置为1,以确保推送不会对每个postcodes数组元素重复,有没有更优雅的方法
非常感谢如果您真的想优化查找,您可以将循环体中的邮政编码[i]和RangeColors[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;
}
}
}
但我不确定这是否会对性能产生显著影响。这感觉像是一个微观优化 如果您真的想优化查找,您可以通过将邮政编码[i]和RangeColors[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;
}
}
}
但我不确定这是否会对性能产生显著影响。这感觉像是一个微观优化 你当然可以这样做:
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;
}
}
}
你当然可以这样做:
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;
}
}
}
使用语句
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;
}
}
}
使用语句
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;
}
}
}
您可以在找到匹配项后设置x的值,而不是使用匹配变量或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]]);
x = rangeColours.length;
}
}
}
您可以在找到匹配项后设置x的值,而不是使用匹配变量或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]]);
x = rangeColours.length;
}
}
}
这是应该在代码中更改的第一件事。是的,对我来说,其他的东西似乎像是微优化,可能是由编译器自己完成的,但不确定这一点。这段代码看起来更具可读性。这是应该在代码中更改的第一件事。是的,对我来说,其他东西似乎像是微优化,可能由编译器自己完成,但不确定这一点。这段代码看起来更易读。这就是RangeColors继续的方式。。。增加10?如果是这样,您应该能够完全消除内部循环。@不,它可以包含任意数量的值,谢谢。RangeColors就是这样继续的。。。增加10?如果是这样,您应该能够完全消除内部循环。@不,它可以包含任意数量的值,谢谢。为什么要在break语句上使用它?为什么要在break语句上使用它?