jQuery. getJSON возврат в переменную массива и манипулирование массивом json - PullRequest
5 голосов
/ 11 марта 2011


Есть ли способ получить возвращение $ .getJSON в массив переменных?
Я знаю, что он асинхронен и находится вне области видимости, но я буду использовать его внутри обратного вызова ajax, мне просто нужно сначала получить все значения и проверить их по другому массиву.

Что-то вроде:

$.getJSON('itemManager.php?a=getItems', function(data){
    // itemArray = new Array(data);
    // idsArray = new Array(data.id);
    for (var i in someOtherArray){
        if($.inArray(i, idsArray) == -1){
            // do something...
            // get jason variable by id?
            // itemArray[i].someVariable
        }
    }
}

РЕДАКТИРОВАТЬ: JSON структура

[{"id":"786","user_id":"1","seller_id":"2","address_id":"1","time":1299852115,"publicComment":null,"personalComment":null},
{"id":"787","user_id":"1","seller_id":"2","address_id":"1","time":1299852115,"publicComment":null,"personalComment":null},
{"id":"785","user_id":"1","seller_id":"2","address_id":"1","time":1299852114,"publicComment":null,"personalComment":null},
{"id":"784","user_id":"1","seller_id":"2","address_id":"1","time":1299852113,"publicComment":null,"personalComment":null},
{"id":"783","user_id":"1","seller_id":"2","address_id":"1","time":1299852111,"publicComment":null,"personalComment":null}]

Это в основном идея.

  • Получить все значения
  • Изолировать значения идентификаторов объектов JSON
  • Цикл другого массива
  • Проверить, находится ли идентификатор json внутри другого массива
  • Доступ к другим переменным json по значению идентификатора

Здесь, наверное, есть различные решения, но я ищу что-то с минимальным кодом.

Ответы [ 2 ]

3 голосов
/ 11 марта 2011

С предоставленной информацией нет ярлыка для проверки существования идентификаторов. Вы действительно должны пройтись по всему. Однако вы можете немного улучшить ситуацию, создав отображение id => object:

$.getJSON('itemManager.php?a=getItems', function(data){
    var items = {};
    for(var i = data.length; i--; ) {
        items[data[i].id] = data[i];
    }
    for (var j = someOtherArray.length; j--; ){
        var item = items[someOtherArray[j]];
        if(item){
            // do something with `item`
        }
    }
}

Было бы еще лучше, если бы вы уже создали эту структуру на сервере, тогда это будет:

$.getJSON('itemManager.php?a=getItems', function(data){
    for (var j = someOtherArray.length; j--; ){
        var item = data[someOtherArray[j]];
        if(item){
            // do something with `item`
        }
    }
}

Вам также следует учитывать, какие массивы будут содержать больше элементов, data или someOtherArray, и настроить свои структуры данных таким образом, чтобы вы зацикливались только на меньшем массиве.

Обновление:

Чтобы создать соответствующую структуру на сервере с PHP, вам нужно создать ассоциированный массив.

Так что в момент, когда вы добавляете объект в массив, вы не должны делать

$items[] = $obj;

но

$items[$obj->id] = $obj; // or $obj['id'] if you have an array
2 голосов
/ 11 марта 2011

Если вы получаете массив в качестве ответа JSON, тогда ваша переменная data в вашем обратном вызове является массивом, вам не нужно ничего с ним делать.

Если вы получаете объект в качестве ответа JSON в качествеdata.id в вашем примере может предложить, и некоторые из его значений являются массивом, тогда просто используйте data.id в качестве массива или используйте var array = data.id;, если вам удобнее.

Помните, что data в вашем обратном вызове - это то, что вы получили как JSON.Это может быть объект (который является ассоциативным массивом), массив, строка, число или значение true, false или null.Если это объект, к которому вы обращаетесь с помощью data.key, если это массив, к которому вы обращаетесь с помощью data[index].Я говорю это потому, что подозреваю, что вы можете путать массивы с объектами здесь.

...