Перебор Json в Jquery

#jquery #json #autocomplete

#jquery #json #автозаполнение

Вопрос:

Всем привет и заранее спасибо за помощь. прежде всего, прошу прощения, если я использую здесь неправильную фразу. Я не так беспокоюсь о синтаксисе здесь, просто заставляю это работать. Теперь проблема: у меня есть сериализатор django, выводящий следующий JSON:

 [
    {
        "pk": 11262, 
        "model": "dict.words", 
        "fields": {
            "lang": "KO", 
            "incorrect": null, 
            "sug_translation": [
                3215
            ], 
            "word": "uc0dduac01ud558ub2e4", 
            "definition": [], 
            "pos": "VE", 
            "phrase": [], 
            "translation": [
                {
                    "pk": 1, 
                    "model": "dict.words", 
                    "fields": {
                        "word": "comprender"
                    }
                }, 
                {
                    "pk": 6028, 
                    "model": "dict.words", 
                    "fields": {
                        "word": "entender"
                    }
                }
            ], 
            "incomplete": null
        }
    }
]
  

Что я хотел бы сделать, так это перейти к fields.translation.поля.слова и, следовательно, Jquery для автозаполнения

 $(function() {

             $( "#query_form" ).autocomplete({
                     minLength: 2,
                     source: 'http://127.0.0.1:8000/json_results/',
                     focus: function( event, ui ) {
                             $( "#query_form" ).val( ui.item.word );
                             return false;
                     },
             select: function( event, ui ) {
                     $.get ('http://127.0.0.1:8000/json_detail/',
                                {
                                 item: ui.item.pk
                                },
                                function(data) {
                                 $('#query_result').prepend(data);
                                });
                     $( "#query_form" ).val( ui.item.word );
                     return false;
             }
     })
     .data( "autocomplete" )._renderItem = function( ul, item ) {
                        var tran = $.each(item.fields.translation, function(i){item.fields.translation[i].fields.word})
                return $( "<li></li>" )
                        .data( "item.autocomplete", item )
                        .append("<a>"   item.fields.word   tran   "</a>")
                        .appendTo( ul );
     };
});
  

Я полный новичок в jquery и javascript в целом, поэтому прошу прощения за любые явные ошибки форматирования. В любом случае, проблема здесь в том, что, хотя это действительно выполняет запрос и функции автозаполнения, $.each(item.fields.translation, функция(i) item.fields.translation[i].fields.word}) возвращает [object, Object] в списке автозаполнения. Если я вывожу его через alert(), он возвращает правильные значения. Если я просто использую item.fields.translation[0].поля.слово в строке .append выводит значение. Но по какой-то причине, когда я прошу его сделать то, что я хочу, я получаю [object Object]
Итак, у кого-нибудь есть идеи, что я делаю не так? Заранее огромное спасибо!

Ответ №1:

Вы устанавливаете свою переменную tran равной $.each() функции, которая возвращает jQuery . Вот почему он становится объектом.

Я не совсем понимаю, что именно вы пытаетесь сделать. Вы перебираете элементы в item.fields.translation массиве, но в конечном итоге выполняете добавление, как если бы этот цикл должен возвращать только одну строку. Но item.fields.translation в его массиве есть два элемента, так что… Вы могли бы создать массив, подобный этому:

 var tran = [];
$.each(item.fields.translation, function(i){
    tran.push(item.fields.translation[i].fields.word);
});
//tran now equals ['comprender','entender']
  

Не уверен, поможет ли это. Если вы уточните, чего вы ожидаете tran , тогда я мог бы помочь дальше.

И еще одно замечание: вы можете передать значение элемента в текущей итерации — а не только его индекс / ключ — функции внутри $.each() . Например:

 $.each(item.fields.translation, function(i,v){
    //the following is the same as tran.push(item.fields.translation[i].fields.word);
    tran.push(v.fields.word);
});
  

Комментарии:

1. Этот первый пример — именно то, что я искал. Я понятия не имел о push (как я уже сказал, полный новичок в js), так что ты, мой друг, мой новый герой. Спасибо, спасибо, спасибо! Сработало сразу: D