我正在尝试在数组中构建数组,我希望能够通过array [x] [y]访问存储的数据。我有一个示例代码,我无法以我想要的方式工作,我想知道是否有人能发现问题。
$.getJSON("/data/", function(data){
var test = {};
var levels = [1,2,3];
$.each(data, function(key, value){
var cat = data[key];
$.each(levels, function(li,l){
var base = cat[2];
var keys = Object.keys(base);
if (l == 1) {
test[l] = {};
$.each(keys, function(ki,k){
test[l][k] = base[k][0];
});
}
});
});
alert(Object.keys(test[1]));
});
获取的JSON数据的结构如下所示:
{
"1": ["Distribution", 0,
{
"9": ["Salmonella", 0,
{}],
"6": ["E. coli", 0,
{
"8": ["from pigs", 0,
{}],
"7": ["from humans", 0,
{}]}]}],
"2": ["Adhesin", 0,
{
"1": ["PapG", 1,
{
"2": ["has three subtypes:", 0,
{
"3": ["PapG-I", 0,
{}],
"4": ["PapG-II", 0,
{}],
"5": ["PapG-III", 0,
{}]}]}]}],
"3": ["Receptors", 0,
{}],
"4": ["Disease associations", 0,
{}],
"5": ["Regulation", 0,
{}]
}
上面的代码似乎没有将值存储到测试数组中的数组,因为alert(Object.keys(test[1]))
没有提供任何内容(即只是空白警报)。
编辑:
$.getJSON("/data/", function(data){
var test = {};
var levels = [1,2,3];
$.each(data, function(key, value){
// var cat = data[key];
$.each(levels, function(li,l){
var base = value[2];
var keys = Object.keys(base);
if (l == 1) {
if ($.inArray(l,test) == -1){
test[l] = {};
}
$.each(keys, function(ki,k){
test[l][k] = base[k][0];
});
}
});
});
alert(Object.keys(test[1]));
});
仍然无法正常工作。
答案 0 :(得分:1)
var cat = data[key];
你不需要这条线。您的数据已在value
。
你在每次迭代时都会覆盖相同的test[l]
值,所以最后你只会得到最后一次最外面迭代的结果 - 在许多浏览器中,这将超过"5": ["Regulation", 0, {}]
键/值对。快速查看代码建议cat[2]
将为{}
,因此最后一次迭代将使用空对象覆盖test[]
中的任何内容。因此,您的keys
正确返回空列表,但您的逻辑中存在错误。
关于您更新的示例:
您仍然使用{}
覆盖测试条目,因为您使用.inArray
进行检查,并且它总是会成功找不到数组中的任何数字值。 .inArray
查找特定值,而不是键/索引。您应该使用if(!test[l])