Итерация по Json в Jquery - PullRequest
       1

Итерация по Json в Jquery

1 голос
/ 05 октября 2011

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

[
    {
        "pk": 11262, 
        "model": "dict.words", 
        "fields": {
            "lang": "KO", 
            "incorrect": null, 
            "sug_translation": [
                3215
            ], 
            "word": "\uc0dd\uac01\ud558\ub2e4", 
            "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.fields.words и, следовательно, 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, function (i) item.fields.translation [i] .fields.word}) [объект, объект] в списке автозаполнения. Если он выводится через alert (), он возвращает правильные значения. Если я просто использую item.fields.translation [0] .fields.word в строке .append, он выводит значение. Но по какой-то причине, когда я прошу его сделать то, что я хочу, я получаю [объект объекта] Итак, кто-нибудь есть идеи, что я делаю неправильно? Большое спасибо заранее!

1 Ответ

1 голос
/ 05 октября 2011

Вы устанавливаете свою переменную 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);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...