2016-02-29 3 views
1

Мой внутренний цикл, кажется, работает нормально, но как только внутренний цикл завершения я ожидать, что первый цикл, чтобы начать снова, но это не делает, и это мне не понятно, почему ...первый цикл не работает

if(search) 
{ 
    // loop through Revenue Arrangements 
    for (var x = 0; search != null && x < search.length; x++) 
    { 
     var revenue_arrangement = nlapiLoadRecord('revenuearrangement', search[x].getValue(columns[0])); 
     nlapiLogExecution('DEBUG', 'Revenue Arrangement Internal ID', search[x].getValue(columns[0])); 

     var count = revenue_arrangement.getLineItemCount('revenueelement'); 
     for (var x = 1; x <= count; x++) 
     { 
      var rev_element_id = revenue_arrangement.getLineItemValue('revenueelement', 'transactionline', x);    

      if(rev_element_id) 
      { 
       nlapiLogExecution('DEBUG', 'Element Internal ID', rev_element_id); 
      } 
     } 
    nlapiLogExecution('DEBUG', 'End of Inner Loop); 
    } 
} 
+0

Вы проверили консоль JS для каких-либо ошибок? Также обратите внимание, что у вашего копируемого/вставленного фрагмента есть опечатка (отсутствует закрывающая цитата в: '' End of Inner Loop') – SidOfc

+0

Спасибо - исправлена ​​опечатка – MG2016

ответ

2

Вы повторно использовать x, а вложенная итерация влияет на внешнюю. Об этом заявил явно в другом ответе, но давайте расширим это, чтобы указать на два аспекта Javascript вы можете быть не в курсе, но вы должны:

  1. Javascript использует блок операторов {}, но не реализует Блокировать сферы , Это означает, что цикл for не создает новую переменную . Это важно, если вы исходите из фона c/C++.

    Смотреть больше: http://doctrina.org/JavaScript:Why-Understanding-Scope-And-Closures-Matter.html (также см для затворов, то есть как внешняя сфера влияет на вложенные функции областей).

  2. Javascript показывает объявления переменных в начало область действия. Это означает, что оба из var x эффективно объявлены в самом начале фрагмента, включенного в вопрос (или , возможно, даже раньше).

    Смотреть еще: http://www.w3schools.com/js/js_hoisting.asp

    Extra вар грузоподъемных пример, который показывает, как Bizzare могут быть его последствия: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html


выше означает, что ваш код (упрощенный) этого :

var search = ["a","b","c","d"], count; 
if(true) { 
    for (var x = 0; x < search.length; x++){   
     count = 2; 
     for (var x = 1; x <= count; x++){    
      console.log("innner", x) 
     }  
     console.log("outer", x) 
    } 
} 

так же, как это:

var search = ["a","b","c","d"], count, x = 1; 
if(true) { 
    for (; x < search.length; x++){ 

     count = 2; 
     for (; x <= count; x++){    
      console.log("innner", x) 
     }  
     console.log("outer", x) 
    } 
} 

Это означает, что вы не только есть две петли, которые влияют друг на друга. Вы также игнорируете элемент 0 из первого массива (var x = 1 во вложенном цикле переопределяет var x = 0 во внешнем).

Оба сниппеты будет:

innner 1 
innner 2 
outer 3 
+0

Спасибо за ссылку - прочитайте сейчас! – MG2016

+0

Поскольку внутренний цикл выполняет итерацию над подсписью NetSuite, 1 является правильным начальным индексом. – erictgrubaugh

7

ваши обе петли (внутренние и внешние) используют ту же переменную в качестве счетчика (x)

Используйте различные встречные переменные для обоих

if(search) 
{ 
    // loop through Revenue Arrangements 
    for (var x = 0; search != null && x < search.length; x++) 
    { 
     var revenue_arrangement = nlapiLoadRecord('revenuearrangement', search[x].getValue(columns[0])); 
     nlapiLogExecution('DEBUG', 'Revenue Arrangement Internal ID', search[x].getValue(columns[0])); 

     var count = revenue_arrangement.getLineItemCount('revenueelement'); 
     for (var y = 1; y <= count; y++) 
     { 
      var rev_element_id = revenue_arrangement.getLineItemValue('revenueelement', 'transactionline', y);    

      if(rev_element_id) 
      { 
       nlapiLogExecution('DEBUG', 'Element Internal ID', rev_element_id); 
      } 
     } 
    nlapiLogExecution('DEBUG', 'End of Inner Loop); 
    } 
} 
+0

Спасибо за супер быстрый ответ - я могу прекратить вытягивать волосы прямо сейчас! – MG2016

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