2017-05-23 2 views
1

Ich habe JSON-Datei, die ich ohne Probleme in js Code lade mit JSON.parse() (einem reduzierten Beispiel für die Datei hier gezeigt, ist es 25 Artikel lange):Fehler beim Versuch, JSON-Array in JavaScript iterieren

{ 
    "List": [ 
    { "Term": "Tos" }, 
    { "Term": "Gripa" }, 
    { "Term": "Catarro"}, 
    { "Term": "Flemas"} 
    ] 
} 

wenn ich es Zugriff auf ein Stück pro Iteration durchlaufen habe ich keine Probleme, aber wenn ich versuche, den Index zu erhöhen, um Elemente zuzugreifen pro Iteration es die folgenden Fehler führt (Kommentar in Code zeigt die Zeile mit dem Problem):

console.log(searchTerms[j].Term);

TypeError: Cannot read property 'Term' of undefined

var data = fs.readFileSync(searchTermsFile); 
var searchTerms = JSON.parse(data); 
searchTerms = searchTerms.List; 
for(var j=0;j<searchTerms.length;j+=4) 
{ 
    console.log(searchTerms[j].Term); 
    j+=1; 
    console.log(searchTerms[j].Term); /****<---- THIS LINE THROWS THE ERROR ****/ 
} 
+0

können Sie nicht auf den nächsten Zyklus warten? oder brauchst du innerhalb der Schleife einen Zugang zum nächsten Gegenstand? –

+0

Ich muss auf 5 Elemente pro Iteration zugreifen – danielgoba84

+0

Sie brauchen nicht 'j + = 1;' da Sie bereits eine for-Schleife haben. Wenn Sie lesen, in diesem Fall 3, wird es bis 4 gehen und versuchen, 'search zuzugreifen [4]' die nicht –

Antwort

1

Ihr Objekt enthält 4 Term und Ihre for Schleifenzählung bis 4, aber j+=1 in der letzten Iteration machen j=5 und es gibt kein Objekt in searchTerms[5]. Das ist der Grund, warum Ihr Code nicht funktioniert. Ich schreibe Probe program.I hoffe, das hilft Ihnen:

var data = { 
 
    "List": [ 
 
     {"Term": "1"}, 
 
     {"Term": "2"}, 
 
     {"Term": "3"}, 
 
     {"Term": "4"}, 
 
     {"Term": "5"}, 
 
     {"Term": "6"}, 
 
     {"Term": "7"}, 
 
     {"Term": "8"}, 
 
     {"Term": "9"}, 
 
     {"Term": "10"}, 
 
     {"Term": "11"}, 
 
     {"Term": "12"} 
 
    ] 
 
}; 
 

 
function test() { 
 
    var searchTerms = data.List; 
 
    var j = 0; 
 
    var currentFiveObject = []; 
 
    for (j = 0; j < searchTerms.length; j += 5) { 
 
    currentFiveObject = []; 
 
    for (var i = 0; i < 5; i++) { 
 
     if (j + i < searchTerms.length) 
 
     currentFiveObject.push(searchTerms[j + i]) 
 
     else 
 
     break; 
 
    } 
 
    console.log(currentFiveObject); 
 
    } 
 
} 
 
test();

+0

ok schlecht bearbeiten Sie den Code, aber das ist nicht das Problem, ich vereinfachte die JSON, um Platz zu sparen , es ist 25 Elemente lang, auch der Code vereinfacht wurde, (wird bearbeiten) ‚j + = 5‘ und innerhalb der Schleife i aktualisieren ‚j‘ und wenn ‚j‘ erhöht wird, und versucht, das nächste Element zugreifen, auch in der ersten Iteration es wirft den Fehler – danielgoba84

+0

@ danielgoba84 Ich fügte Beispielcode für Ihren Fall hinzu.Bitte testen Sie, dass –

+0

dies hilft !, danke! – danielgoba84

0

Sie könnten ein Standardobjekt verwenden, das den Fehler behebt, aber auch zurückgibt.

j += 1; 
console.log((searchTerms[j] || {}).Term); 

Die andere Art und Weise mit dem Indizes außerhalb des zulässigen Bereichs zu beschäftigen, ist eine Überprüfung im Voraus zu verwenden, und verwendet einen Index größer als der letzten Indexwert zu verhindern.

if (j < searchTerms.length) { 
    // process item 
    console.log(searchTerms[j].Term); 
} 
+0

dies hilft, danke – danielgoba84

0

Das ist, weil Sie j und dann Inkrementieren Überprüfung, aber da Sie bis zum length - 1 iterieren es wird nach j += 1 außerhalb der Grenzen gehen, versuchen

var data = fs.readFileSync(searchTermsFile); 
var searchTerms = JSON.parse(data); 
searchTerms = searchTerms.List;for(var j=0;j<searchTerms.length - 1;j++) 
{ 
console.log(searchTerms[j].Term); 
j+=1; 
console.log(searchTerms[j].Term); 
} 
0

können Sie versuchen, diese

var data = fs.readFileSync(searchTermsFile); 
var searchTerms = JSON.parse(data); 
var i = 0; 
searchTerms = searchTerms.List;for(var j=0;j<searchTerms.length;j++) 
{ 
i = j 
console.log((searchTerms[i] || {}).Term); 
i +=1; 
console.log((searchTerms[i] || {}).Term); 
} 
+0

verstehe nicht, wie das funktionieren soll, kannst du das erklären? – danielgoba84

0

Das eigentliche Problem Sie konfrontiert sind, ist, dass Ihr j-Index Sie benötigen ein Element, das nicht in Ihrem JSON-Objekt enthalten ist. Ich habe keinen Grund gefunden, dass Ihr Zyklus Ihre Indexvariable während der Protokollierung Ihrer Bedingungen erhöht.

Wenn das Indexinkrement bestimmt ist, dann müssen Sie prüfen, ob der Wert von j gleich oder größer ist als search Länge, bevor es als Index Zugriff verwendet wird.

Entfernen Sie es oder befassen Sie sich damit.