Звучит намного сложнее, чем есть на самом деле.
Итак, в Perl вы можете сделать что-то вроде этого:
foreach my $var (@vars) {
$hash_table{$var->{'id'}} = $var->{'data'};
}
У меня есть объект JSON, и я хочу сделать то же самое, но с ассоциативным массивом javascript в jQuery.
Я пробовал следующее:
hash_table = new Array();
$.each(data.results), function(name, result) {
hash_table[result.(name).extra_info.a] = result.(name).some_dataset;
});
Где данные - это объект JSON, полученный в результате вызова $ .getJSON. Это выглядит примерно так (мой синтаксис JSON может быть немного неправильным, извините):
{
results:{
datasets_a:{
dataset_one:{
data:{
//stuff
}
extra_info:{
//stuff
}
}
dataset_two:{
...
}
...
}
datasets_b:{
...
}
}
}
Но каждый раз, когда я это делаю, firebug выдает следующую ошибку:
"Фильтр XML применяется к данным, отличным от XML"
Зачем вам менять массив на другой? -)
- почему бы просто не получить доступ к данным, если вы хотите упростить или отфильтровать, вы можете напрямую перемещаться по массивам объекта! -)
Это работает. Просто скопируйте его в блок скрипта для тестирования.
d = {
'results':{
'datasets_a':{
'dataset_one':{
'data':{
'sample':'hello'
},
'extra_info':{
//stuff
}
},
'dataset_two':{
///
}
///
},
'datasets_b':{
///
}
}
}
alert(d.results.datasets_a.dataset_one.data.sample)
Надеюсь, это вставлено правильно. Этому редактору не нравятся мои разрывы строк в коде.
d = {
'results':{
'datasets_a':{
'dataset_one':{
'data':{
'sample':'hello'
},
'extra_info':{
//stuff
}
},
'dataset_two':{
///
}
///
},
'datasets_b':{
///
}
}
};
alert(d.results.datasets_a.dataset_one.data.sample)
Думаю, вы можете использовать ответ JSON как ассоциативный массив. Таким образом, вы должны иметь возможность напрямую использовать JSON.
Предполагая, что вы получили приведенный выше пример:
$('result').innerHTML = data['results']['dataset_a']['dataset_two']['data'];
// Or the shorter form:
$('result').innerHTML = data.results.dataset_a.dataset_two.data;
Поймите, я не тестировал это, но безопаснее использовать квадратные скобки с переменной, чем использовать круглые скобки плюс имя с точкой доступа.
Ваш пример терпит неудачу из-за какой-то запутанной логики, которую я только что уловил.
$.each(data.results), function(name, result) {
hash_table[result.(name).extra_info.a] = result.(name).some_dataset;
});
Теперь цикл foreach проходит через переменную data.results
, чтобы найти внутренние элементы на глубине 1. Найденный элемент передается лямбда с ключом элемента. AKA, первым результатом будет name = "datasets_a" item = object
. Следишь за мной так далеко? Теперь вы обращаетесь к возвращенному хешу, объекту в item
, как если бы у него есть дочерний ключ в name
... "datasets_a". Но подождите, это является объект!
Если ничего не помогает ... динамически запишите результат JSON в текстовое поле и убедитесь, что он правильно отформатирован.
Я принял первую часть, так как оказалось, что я мог просто получить прямой доступ к объекту json. Глупо с моей стороны не осознавать этого во-первых.
Хорошо, в MooTools все наоборот, так что я привык к этой модели.
+1 за то, что сказал мне data['results']['dataset_a']['dataset_two']['data'];
способ вызова json-объектов.
квадратная скобка - это аксессоры, которые можно использовать на массивах arr = [1]; arr[0]
и объектах obj = { foo : 'hello world'}; obj['foo']; x = 'foo'; obj[x]
в вашем последнем блоке кода это должна быть функция (имя, результат). name является ключом, а result - значением этого ключа.