2014-01-12 53 views
0

动态multidimmensional关联数组我从PHP持有类似这样的多行得到一个JSON对象:JavaScript创建从JSON

id | type | amount| age 
1 | abc | 1 | 1 
2 | def | 2 | 1 
3 | def | 4 | 2 
4 | def | 13 | 3 

我运行它通过JavaScript:

$.ajax({ 
    type: 'POST', 
    url: "test.php", 
    dataType: 'json', 
    success: function (data) { 
     var arr = []; 
     for (var i = 0; i < data.length; i++) { 
      arr[data[i].type][data[i].age] = data[i].ammount; 
     } 
    } 
}); 

的想法是获取阵列,如下所示:

arr[def][1] = 2 
arr[def][2] = 4 
arr[def][3] = 13 
arr[abc][1] = 1 
arr[abc][2] = 0 // note that this one is just empty because it was not declared from json data. 

不幸的是,我收到一个错误:

Uncaught TypeError: Cannot set property '1' of undefined

1是[data[i].age]如果我改变它的值错误出现与其他数字。

+0

您能得到什么,什么你结束了?为什么你不使用.push? –

+0

我得到json对象,我可以访问所有的属性,即数据[i] .type,所以我可以从数据[3] .type = def中获取。如上所述,我最终会遇到错误。我不能使用推,因为我得到的所有数据是随机顺序 - 使用适当的键我可以很容易地排序 – Kalreg

+0

我认为你应该初始化内部数组。我建议你检查这个问题:http://stackoverflow.com/questions/13725138/javascript-multi-dimensional-dynamic-array。 – kgd

回答

5

你应该这样做:

var arr = {};  
for (var i = 0; i < data.length; i++) { 
    var type = data[i].type, 
     age = data[i].age, 
     amount = data[i].ammount; 
    if(!arr[type]) arr[type] = {}; //Create arr[type] if it doesn't exist 
    arr[type][age] = amount; 
} 

您可以填补空细胞0,但我还是奉劝读做:而不是用arr["abc"][2]阅读

//returns the value or 0 
function readArr(arr, type, age){ 
    if(!arr[type]) return 0; 
    return arr[type][age] || 0; 
} 

然后, ,你会阅读readArr(arr, "abc", 2)

(如果你愿意,你当然可以避免声明功能,但使用它的逻辑在线,你会做这样的事情(arr["abc"] ? arr["abc"][2] || 0 : 0)

欢呼声中,来自拉巴斯,玻利维亚

+0

这一个完美的罚款。非常感谢你,还有一些额外的信息。来自奥尔什丁,波兰,中欧的问候:) – Kalreg

+0

欢迎,Kalreg,我和几个来自波兰的朋友一起工作:),很高兴再有一个朋友从那里! –

+0

btw您能否将我的答案标记为已接受? :D –

1

我认为这是因为当您设置其abc属性或密钥时,arr['abc'](或任何关键字)仍未定义为数组(或JSON对象)。

var arr = []; 
for (var i = 0; i < data.length; i++) { 
    if (!arr[data[i].type]) { 
    arr[data[i].type] = []; 
    } 
    arr[data[i].type][data[i].age] = data[i].ammount; 
} 

或者,如果你想使用JSON对象

var arr = {}; 
for (var i = 0; i < data.length; i++) { 
    if (!arr[data[i].type]) { 
    arr[data[i].type] = {}; 
    } 
    arr[data[i].type][data[i].age] = data[i].ammount; 
} 
+0

你的答案也很好,不幸的是我只能接受一个答案:( – Kalreg