2016-08-30 5 views
-1

Ich habe Probleme, durch zurückgegebene JSON Ergebnis durchlaufen. Wenn das Ergebnis einigen Anforderungen entspricht, dann fügen Sie sie an ein <li> Element an. Ja, ich lerne immer noch :)Schleife durch getJson Ergebnis

Das zurückgegebene Ergebnis sieht so aus [text][text2][text3]bla,blabla, blabla. Ich möchte nur die Elemente in Klammern greifen. Danach müssen diese Klammern entfernt werden und das gereinigte Ergebnis sollte in einem <li> Element platziert werden.

Also, was ich habe, ist dies:

$.getJSON('some-url?format=json', function(e) { 

    var keywords = e.shop.keywords; //result = [text][text2][text3]bla,blabla, blabla 

    $(keywords).each(function(i, keys) { 
     var keys = keywords.match(/\[(.*?)\]/); //matches if text is between brackets 

     if (keys) { 
     var submatch = keys[1]; 
     } 
    }); 

    $('.some-div ul').html('<li>'+submatch+'</li>'); 

}); 

es wie oben tun gibt mir einen Fehler Error: Syntax error, unrecognized expression: [text][text2][text3]

Was ich mir falsch?

+0

sollten Sie ein Array 'jeder()' Funktion übergeben ... –

+0

'keywords' ist eine Zeichenfolge, nicht wahr? Wenn Sie eine Zeichenfolge in '$()' einschließen, wird sie nicht automatisch in ein Array konvertiert, und selbst wenn dies der Fall wäre, wäre die von Ihnen verwendete Syntax falsch. Siehe API http://api.jquery.com/jquery.each/ wie man '$ .each()' –

+1

verwendet, wenn '[text] [text2] [text3] bla, blabla, blabla' dein JSON ist vollständig vermurkst/ungültig, und ich frage mich, ob dein Skript keinen Fehler ausgelöst hat. * Edit: * Es scheint, dass dies genau der Fehler ist, den Sie bekommen. ** behebe die Daten, die vom Server zurückgegeben werden, um gültig zu sein JSON ** – Thomas

Antwort

2

dass e.shop.keywords Vorausgesetzt ist eine Zeichenfolge, die Sie wünschen, einen regulären Ausdruck auf, verwenden Sie einfach die JavaScript Regex String#match Funktion und eine Schleife über das Ergebnis Array#forEach mit auszuführen:

$.getJSON('some-url?format=json', function(e) { 
    // if e.shop.keywords is string "[text][text2][text3]bla,blabla, blabla" 
    // perform a regex match on the string... and loop over using forEach 
    var result = e.shop.keywords.match(/\[([^\]]+)\]/g); 
    if(result) { 
    result.forEach(function(text){ 
     // since we're dealing with the entire match rather than match group 1 
     // we'll want to chop off the first "[" and last char "]" via substring 
     $('.some-div ul').append('<li>'+text.substring(1,text.length-1)+'</li>'); 
     // also: use append rather than html to avoid overwriting previous li elements 
    }); 
    } 
}); 

Die oben AUSGABE:

<li>text</li> 
<li>text2</li> 
<li>text3</li> 

Welche können Sie unabhängig von Ihrem AJAX-Anruf testen:

"[text][text2][text3]bla,blabla, blabla".match(/\[([^\]]+)\]/g).forEach(function(text){ 
    console.log('<li>'+text.substring(1,text.length-1)+'</li>'); 
}); 
+0

Das funktioniert perfekt! Allerdings ein kleines kleines Ding ... Wenn die Zeichenfolge nicht übereinstimmt, gibt es 'null' zurück. – Meules

+0

Guter Fang, @Meules. Das Snippet wurde aktualisiert, um zu verifizieren, dass ein Ergebnis von 'String # match' zurückgegeben wurde. – Cam

+0

Ok scheint jetzt gut zu funktionieren. Danke! – Meules

1

Sie versuchen, einen Selektor für eine Zeichenfolge zu verwenden: $(keywords). Das ist ganz sicher nicht das, was Sie tun möchten. Ich kann die Verwirrung hier sehen, so als ob Sie erwartet hätten, dass keywords ein Array ist, wenn es nicht ist.

Stattdessen sollten Sie den regulären Ausdruck .match() für die Zeichenfolge verwenden, die Sie über var keywords = e.shop.keywords; referenziert haben. Dann sollten Sie über das 'Spiel Array' Interate wie so:

$.getJSON('some-url?format=json', function(e) { 

    var keywords = e.shop.keywords; //result = [text][text2][text3]bla,blabla, blabla 
    var keys = keywords.match(/\[(.*?)\]/); //matches if text is between brackets 

    $.each(keys, function(index, value) { 
     //Here, index is the index of the array keys 
     //value is the matched string. 
     $('.some-div ul').append('<li>'+value+'</li>'); 
    }); 
});