2016-08-31 4 views
-1

Я пытаюсь написать цикл, который проверяет строку, чтобы увидеть, содержится ли хранимая переменная в строке, а затем заменяет эту переменную сохраненным значением. У меня есть эта часть, работающая нормально, однако после моего цикла while код останавливается и не запускается. Вот код:Код javascript не будет запущен после цикла

var output = document.getElementById('output'); 
 

 
String.prototype.replaceAll = function(search, replacement) { 
 
    var target = this; 
 
    return target.split(search).join(replacement); 
 
}; 
 

 
var sortedVarArray = [ 
 
    //[varName, value, units, complex?] 
 
    ["d",   2, null,  0], 
 
    ["h",   3, null,  0], 
 
    ["u", "d + h", null,  1] 
 
]; 
 

 
var value = 'u + 1'; 
 
var complex = true; 
 

 
while (complex) { 
 
    complex = false; 
 
    for (var i = 0; i -1 < sortedVarArray.length; i++) { 
 
     if (value.indexOf(sortedVarArray[i][0]) > -1 && sortedVarArray[i][3] == 1) 
 
      complex = true; 
 
     value = value.replaceAll(sortedVarArray[i][0], sortedVarArray[i][1]); 
 
     if (complex) break; 
 
    } 
 
    output.innerHTML += "<br> hello"; 
 
} 
 
output.innerHTML += "<br> hello2"; 
 

 
var result = eval(value); 
 
output.innerHTML += "<br> result = " + result;
<div id="output"></div>

так что если, например, у меня есть массив sortedVarArray, который выглядит как:

sortedVarArray = [ 
    ["varName", "value", "units", "complex?"] 
    ["d", 2, null, 0] 
    ["h", 3, null, 0] 
    ["u", "d + h", null, 1] 
] 

и уравнение value равного u + 1

, который, по ходу цикла, должен измениться следующим образом:

u + 1 
d + h + 1 
2 + h + 1 
2 + 3 + 1 

, который будет оценивать в 6 в конце

Моя проблема заключается в том, что код не делает его из for цикла, если он breaks, и тогда он не делает это из while петля. и мой код никогда не оценивает.

У меня есть куча выходных сообщений в моем коде (очищается для здесь), и я вижу, что строка value изменяется по мере необходимости в виде кодов. Я просто не знаю, почему он не продолжается после окончания цикла.

О, и если я изменю код так, чтобы complex был объявлен как ложный, цикл пропускается и "hello2" напечатан на output.

Спасибо заранее,

Dan

EDIT: функция ReplaceAll содержится в начале сценария (за пределами какой-либо функции) и выглядит следующим образом:

String.prototype.replaceAll = function(search, replacement) { 
    var target = this; 
    return target.split(search).join(replacement); 
}; 
+3

'У меня есть массив, который выглядит sortedVarArray like' - не очень, потому что не будет действительным массивом - являются d, ч и и фактически строки«г»,«з»и «u» или значения d, h и u (которые вы не разделяете с нами) ... d + h на самом деле строка «d + h» или значение d + h? также, что такое 'replaceAll'? другую функцию, которую вы не поделили? –

+0

@JaromandaX Да, это строки. Я отредактировал исходное сообщение, чтобы показать это, и добавил функцию replaceAll. –

+0

У вас возникли ошибки в консоли? * «Моя проблема в том, что код не выходит из цикла for, если он не сломается» * - Почему бы и нет? Ничто внутри цикла 'for', кажется, не изменяет счетчик циклов' i' или массив 'sortedVarArray', так почему бы не закончить цикл' for', когда он доходит до конца массива? – nnnnnn

ответ

2

в вашем для петли:

i - 1 < sortedVarArray.length 

будет перебирать ваш массив для индекса 0 в длину, whe re array [length] = undefined. попробуйте:

i < sortedVarArray.length 
+0

pfftt решил это! Спасибо за это. Я немного смущен - по какой-то причине я думал, что 'array.length' начал отсчитывать 0, так как это делает VBA. Спасибо всем за вашу помощь. –

+0

@DanW - Индексы массива в JS * do * начинаются с 0. Вот почему последний элемент в массиве находится в индексе 'array.length - 1'. (Но VB странно, потому что, когда вы объявляете массив VB, вы указываете индекс последнего элемента, а не длину.) – nnnnnn

+0

@nnnnn да, но когда вы оцениваете 'array.length', оно возвращает количество элементов, а не число элементов -1. Поэтому, если в массиве есть 2 элемента, 'array.length' вернет' 2', а элементы будут 'array [0]' и 'array [1]' –

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