2016-08-30 2 views
-1

У меня возникли проблемы с возвратом результата JSON. Если результат соответствует некоторым требованиям, добавьте их в элемент <li>. Да, я все еще учусь :)Loop через результат getJson

Полученный результат выглядит следующим образом: [text][text2][text3]bla,blabla, blabla. Я хочу только захватить элементы между скобками. Впоследствии эти скобки необходимо удалить, а очищенный результат должен быть помещен в элемент <li>.

Так что у меня есть это:

$.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>'); 

}); 

Делая это, как выше, дает мне ошибку Error: Syntax error, unrecognized expression: [text][text2][text3]

Что я делаю неправильно?

+0

вы должны передать массив в '' каждой функции() ... –

+0

'keywords' это строка, верно? Обертка строки в '$()' не автоматически преобразует ее в массив, и даже если бы это было так, синтаксис, который вы используете, был бы неправильным. См. API http://api.jquery.com/jquery.each/, как использовать '$ .each()' –

+1

, если '[text] [text2] [text3] bla, blabla, blabla' - ваш JSON, это полностью испорчен/недействителен, и мне интересно, что ваш скрипт не выдал ошибку. * Редактировать: * Кажется, что это именно то, что вы получаете. ** исправить данные, возвращаемые сервером, чтобы быть действительными. JSON ** – Thomas

ответ

2

Предположив, что e.shop.keywords является строка, которую вы хотите выполнить регулярное выражение на, просто использовать регулярные выражения String#match функции и цикл в JavaScript над результатом использования Array#forEach:

$.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 
    }); 
    } 
}); 

выше выход будет:

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

Который вы можете проверить независимо от вашего звонка AJAX:

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

Это работает отлично! Однако одна маленькая крошечная вещь ... Когда строка не соответствует, она возвращает «null». – Meules

+0

Хороший улов, @Meules. Этот фрагмент был обновлен, чтобы убедиться, что результат был возвращен из 'String # match' – Cam

+0

Теперь, похоже, теперь хорошо работает. Thx человек! – Meules

1

Вы пытаетесь использовать селектор в строке: $(keywords). Это, безусловно, не то, что вы хотите сделать. Я вижу здесь путаницу, поскольку выглядит так, как если бы вы ожидали, что keywords будет массивом, когда это не так.

Вместо этого вы должны использовать регулярное выражение .match() в строке, на которую вы ссылаетесь, через var keywords = e.shop.keywords;. Затем, вы должны interate над «массив матч», как так:

$.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>'); 
    }); 
}); 
Смежные вопросы