2012-05-08 2 views
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] 

Я хотел бы знать, есть ли способ сделать код более эффективным, особенно в отношении сокращения расточительных поисковых запросов, которые происходят во втором цикле? В данный момент я использую переменную «match» и устанавливаю ее в 1, если значение элемента массива postcodes меньше значения элемента массива rangeColours, чтобы гарантировать, что push не повторяется для каждого элемента массива почтовых индексов, является там более элегантный способ сделать это?

Большое спасибо

+0

Разве что 'rangeColours' продолжает ... увеличиваться на 10? Если это так, вы должны полностью устранить внутренний цикл. –

+0

@cliffsofinsanity Нет, он может содержать любое количество значений, спасибо. –

ответ

4

Если вы действительно хотели, чтобы оптимизировать Lookups можно удалить избыточный поиск в 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

Вы могли бы, конечно, сделать что-то вроде этого:

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; 
     } 
    } 
} 
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; 
     } 
    } 
} 
+0

Это первое, что нужно изменить в коде. –

+0

Да, мне кажется, что еще одна вещь кажется микропроцессором, которая может быть выполнена самим компилятором (не уверен в этом). И этот код кажется более читаемым. –

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; 
     } 
    } 
} 
+1

Зачем вам это использовать? –

Смежные вопросы