2015-01-31 6 views
0

Этот вызов функции parsePre останавливается после первого элемента в массиве [1, "PHYS112", "PHYS122"]. Он не переходит к следующему элементу в массив. Мне было интересно, есть ли что-то, что остановит цикл for-loop от первого вызова?Трудности синтаксического анализа массива

var stuff = { 
       "subject":"PHYS", 
       "catalog_number":"375", 
       "title":"Stars", 
       "prerequisites":"Prereq: PHYS 112 or 122 and two of PHYS 234, 241, 242, 256, 258\/358, 263, 275", 
       "prerequisites_parsed":[ 
       [ 1, "PHYS112", "PHYS122" ],[ 2,"PHYS234","PHYS241","PHYS242","PHYS256", 
               [ 1, "PHYS258", "PHYS358"], 
               "PHYS263", "PHYS275"]] 
      }; 
var pr = stuff.prerequisites_parsed; 


var parsePre = function (pre){ 
    console.log(pre); 
    console.log(pre.length); 
    for(i = 0; i < pre.length; i++){ 
    console.log(i); 
    if(typeof pre[i] === 'number'){ 
     console.log(pre[i] + " of: "); 
    } 
    else if(typeof pre[i] === 'string'){ 
     console.log(pre[i] + ", "); 
    } 
    else { 
     console.log("WE SHOULD RECURSE"); 
     parsePre(pre[i]); 
    } 
    } 
} 

parsePre(pr); 

ответ

1

Рекурсия нарушается, потому что каждый вызов повторно использует один и тот же i переменную в for -loop. Чтобы это исправить, заменить строку с:

for (var i = 0; ...) 

Это происходит потому, что при присваивании переменной без использования var, она рассматривается как глобальная переменная. Это причуда, характерная для JavaScript, но не для большинства других языков.

В будущем, вы можете поймать эти проблемы, поставив эту строку в верхней части вашего кода JavaScript: "use strict";

+0

Использование функции рамки '«использовать строгий»,' лучше, чтобы вы случайно не сломать, не -строчный совместимый сторонний код - * по крайней мере на данный момент * – jdphenix

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