我从PHP中获取了一个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.
不幸的是我收到了错误:
未捕获的TypeError:无法设置未定义的属性“1”
1为[data[i].age]
,如果我更改其值,则会出现其他数字错误。
答案 0 :(得分: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
填充空单元格,但我最好建议您阅读:
//returns the value or 0
function readArr(arr, type, age){
if(!arr[type]) return 0;
return arr[type][age] || 0;
}
然后,您不是使用arr["abc"][2]
阅读,而是使用readArr(arr, "abc", 2)
阅读。
(如果你愿意,当然你可以避免声明一个函数但是使用它的逻辑内联,你会做(arr["abc"] ? arr["abc"][2] || 0 : 0)
之类的事情
答案 1 :(得分:1)
我认为这是因为arr['abc']
(或其他任何键)在设置其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;
}