使用分配的ID创建JSON数组

时间:2014-04-03 16:39:27

标签: javascript jquery json multidimensional-array

我过去在JSON方面做了大量的工作,但我从来不需要编写自己的JSON对象。既然我已经完成了这样的任务,那么我在制作它时会遇到一些麻烦,这会给我带来最少的麻烦。基本上,我想第一次就做好。

我的JSON数组最终会变得更大,但出于这些目的,我会保持它的小。

以下是我目前所做的事情:

{
    "ClassGroup": [
        {
            "id": "123",
            "classname": "Class 1",
            "isActive": "true",
            "isExpanded": "false",
            "students": [11, 22, 33, 44, 55],
            "isSelected": [11, 22, 33, 44, 55]
        },
        {
            "id": "456",
            "classname": "Class 2",
            "isActive": "false",
            "isExpanded": "false",
            "students": [66, 77, 88, 99],
            "isSelected": [66, 88, 99]
        }
    ],
    "Student": [
        {
            "id": "11",
            "first": "Student",
            "last": "One",
            "classes": [123],
            "isSelected": [123]
        },
        {
            "id": "22",
            "first": "Student",
            "last": "Two",
            "classes": [123],
            "isSelected": [123]
        }
    ]
}

目前,阵列中缺少许多学生和班级,因此请忽略您看到的任何缺失的ID。

当这样做,并运行jQuery.getJSON函数时,我最终会得到一个这样的数组:

  

数据[' ClassGroup'] [0] [' id']将等于" 123"   数据[' ClassGroup'] [1] [' id']将等于" 456"数据['学生'] [0] [' ID']   将等于" 11"

这个问题是,当给出一个类的ID时,我不能轻易找到该类。例如,如果我想找到类的名称" 456",我将不得不遍历数组,直到找到X使data['ClassGroup'][X]['id']等于&#34 ; 456"而不仅仅是data['ClassGroup']['456']['classname']

我想要做的是重写这个JSON,使$.getJSON的结果与以下内容一致:

  

数据[' ClassGroup'] [' 123'] [' classname'] =" Class 1"   数据[' ClassGroup'] [' 456'] [' classname'] =" Class 2"   数据['学生'] [' 11'] ['最后'] ="一个"

我想你了解了。

我能以正确的方式解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

重写你的JSON,看起来像这样:

{
    "ClassGroup": { /* <- Changed from [ to { */
        "123": {    /* <- The class id is now the array key */
            "id": "123",
            ...
        },
        "456": {
            "id": "456",
            ...
        }
    } /* <- Changed from ] to } */
}

答案 1 :(得分:1)

您可以编写一个函数来消除迭代所涉及的所有错误:

function getPropValue(param) {
  var obj = data.ClassGroup.filter(function (el) {
    return el[param.where] === param.is;
  });
  return obj[0][param.find];
}

getPropValue({
  find: 'classname',
  where: 'id',
  is: '456'
});

Fiddle