JSON объект -> массив?как я должен преобразовать это? - PullRequest
0 голосов
/ 31 мая 2011

Возьмите два :) У меня есть текстовое поле автозаполнения jquery, и после нажатия кнопки мне нужно проверить, было ли введенное значение получено из автозаполнения или это совершенно новое значение.

Проблема в том, что «кеш» - это своего рода массив объектов JSON, но он может использовать if (вход в кеш) {...} I необходимо преобразовать его в простой массив JavaScript. Каков наилучший способ сделать это?

P.S. FireBug говорит 'cache = [объект объекта]'

//////////////////////////////////////////// autocomplete code //////////////////
    var cache = {},
        lastXhr;
    $( "#inputV" ).autocomplete({
        minLength: 2,
        source: function( request, response ) {
            var term = request.term;
            if ( term in cache ) {
                response( cache[ term ] );
                return;
            }

            lastXhr = $.getJSON( "search.php", request, function( data, status, xhr ) {
                cache[ term ] = data;
                if ( xhr === lastXhr ) {
                    response( data );
                }
            });
        }
    });


////////////////////////// check if input comes from autocomplete  //////////////////
    $('#btn_check').click(function()        {

        var input = $("#inputV").val();
        alert(input);

        console.log('cache='+cache); 
        /// FireBug says 'cache=[object Object]'

        if ( input in cache ) 
            {
                alert("yes");
             }  
            else
            {
                alert("no");
            }   
    });

Вот как выглядит ответ.

[
    {
        "id": "Podiceps nigricollis",
        "label": "Black-necked Grebe",
        "value": "Black-necked Grebe"
    },
    {
        "id": "Nycticorax nycticorax",
        "label": "Black-crowned Night Heron",
        "value": "Black-crowned Night Heron"
    },
    {
        "id": "Tetrao tetrix",
        "label": "Black Grouse",
        "value": "Black Grouse"
    },
    {
        "id": "Limosa limosa",
        "label": "Black-tailed Godwit",
        "value": "Black-tailed Godwit"
    },
    {
            "id": "Chlidonias niger",
        "label": "Black Tern",
        "value": "Black Tern"
    },
    {
        "id": "Larus marinus",
        "label": "Great Black-backed Gull",
        "value": "Great Black-backed Gull"
    },
    {
        "id": "Larus fuscus",
        "label": "Lesser Black-backed Gull",
        "value": "Lesser Black-backed Gull"
    },
    {
        "id": "Larus ridibundus",
        "label": "Black-headed Gull",
        "value": "Black-headed Gull"
    },
    {
        "id": "Turdus merula",
        "label": "Common Blackbird",
        "value": "Common Blackbird"
    },
    {
        "id": "Sylvia atricapilla",
        "label": "Blackcap",
        "value": "Blackcap"
    },
    {
        "id": "Rissa tridactyla",
        "label": "Black-legged Kittiwake",
        "value": "Black-legged Kittiwake"
    },
    {
        "id": "Aegypius monachus",
        "label": "Eurasian Black Vulture",
        "value": "Eurasian Black Vulture"
    }
]

Ответы [ 2 ]

2 голосов
/ 31 мая 2011

(Заменяющий ответ, я не хотел, чтобы последний был CW.)

Проблема в том, что «кеш» - это своего рода массивОбъекты JSON

На самом деле это не массив.Это объект.(Он создается с помощью var cache = {};, как мы можем сказать.)

... но чтобы использовать if ( input in cache ) { ... } Мне нужно преобразовать его в простой массив javascript.

На самом деле нет.Оператор in в этом контексте проверяет, содержит ли объект свойство с именем, которое вы ему даете.Пример:

var obj = {foo: 1};  // An object with a property called "foo"
alert('foo' in obj); // alerts true, `obj` has a "foo" property
alert('bar' in obj); // alerts false, there is no "bar" property in `obj`

Обратите внимание, что левая часть оператора in должна быть строкой (это может быть литерал, как указано выше, или любое выражение, которое приводит к строке, например,ссылка на переменную).

Код в вашем обработчике click принимает значение поля "inputV" и проверяет, является ли это значение именем свойства в cache объекте.

Вы, вероятно, хотите проверить, является ли это значением одного из свойств объекта cache.Если так:

$('#btn_check').click(function()        {

    var input = $("#inputV").val();
    var found, propName;

    alert(input);

    console.log('cache='+cache); 
    /// FireBug says 'cache=[object Object]'

    found = false;
    for (propName in cache ) {
        if (cache[propName] == input) {
            found = true;
            break;
        }
    }
    alert(found);
});

Поскольку мы знаем, что cache старый скучный объект (из-за того, что он создан с var cache = {};), мы можем довольно безопасно использовать цикл for..in, как указано выше.Но если вы хотите быть более осторожным, вы должны использовать hasOwnProperty, чтобы убедиться, что вы проверяли только те свойства, у которых cache имеет свою собственную копию (в отличие от тех, которые он наследует от своего прототипа):

    for (propName in cache ) {
        if (cache.hasOwnProperty(propName) && cache[propName] == input) {
            found = true;
            break;
        }
    }

Опять же, в этом случае это на самом деле не нужно, потому что мы знаем, что cache - простой объект и запрещает кому-то делать что-то действительно глупое, например, расширение Object.prototype (что Ты не должен делать), все егоперечислимые свойства (вещи, которые перечисляет for..in) являются его собственными свойствами.

0 голосов
/ 31 мая 2011

Трудно сказать, не видя, как выглядит JSON. Возможно, вы могли бы заменить if ( input in cache ) на if(cache.hasOwnProperty(input)) и не потрудиться преобразовать его в массив, но это зависит от того, что содержит объект кэша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...