从json在javascript中创建动态多维关联数组

时间:2014-01-12 00:11:06

标签: javascript jquery arrays json

我从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],如果我更改其值,则会出现其他数字错误。

2 个答案:

答案 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;
}