将JSON转换为关联数组

3

我希望将一个JSON响应转换为关联数组,但似乎我无法做到正确。

这是我的JSON示例响应:

{
   "response":[
  {
     "id":100,
     "certificate":{
        "id":1,
        "title":"Lorem ipsum dolor sit amet, consectetur adipiscing elit."

     },
     "created_at":"2013-12-02T15:20:08.233Z"

  },
  {
     "id":101,
     "certificate":{
        "id":2,
        "title":"Aenean facilisis, nisl vitae pulvinar varius."
     },
     "created_at":"2013-12-02T15:20:08.240Z"

  }
 ],
"count":2
}

这是目前我所尝试的内容:
    var len = obj.response.length;
    var rData = [];
    var gcData = [];


    for(var i = 0; i < len; i++){

        rData[i] = $.map(obj.response[i], function(value, index) {

            if(typeof value=="object"){
                gcData = $.map(value, function(value1, index) {
                    return [value1];
                });

                return gcData;

            }else{              
                return [value];
            }
        });     

    }

My expected output:

rData = [
    100 : [
           id: ["100"],
           certificate: [
              id: ["1"],
              title: ["Lorem ipsum dolor sit amet, consectetur adipiscing elit."]
           ],
           created_at: ["2013-12-02T15:20:08.240Z"]   

         ]
    101 : [
           id: ["101"],
           certificate: [
              id: ["2"],
              title: ["Aenean facilisis, nisl vitae pulvinar varius."]
           ],
           created_at: ["2013-12-02T15:20:08.240Z"]   

         ]

]

Please help. Thanks.


1
那个 rData = [ 100 : .. 的部分已经是无效的了。你为什么要把 每个值 都放进一个数组里呢?这样访问数据会变得更加困难。JavaScript 没有关联数组,但你可以用对象作为 键 -> 值 映射。现有的数据结构有什么问题吗,也就是 JSON 的结构方式?你只是想创建一个映射 id -> object 吗?请解释一下你实际想要解决的问题。 - Felix Kling
@FelixKling 好的,我只是想按键分组,就像我在期望输出中所示的那样。虽然不一定完全相同。我特别在“certificate”内部部分遇到了困难。 - JunM
我想指出的是,您的问题似乎与JSON无关。 您正在处理的值 obj.response 是一个JavaScript数组。 您如何获取数据(即作为JSON)与您要尝试做的事情无关。 - Felix Kling
@FelixKling 我在这里把事情搞得很复杂,其实我可以直接使用 obj.response 而不必将其转换为数组。我会在我的端上进行一些实验,并稍后接受答案。感谢您的帮助。 - JunM
是的,如果您不需要 id -> object 映射,则直接使用 obj.response 当然是最简单的方法。 - Felix Kling
2个回答

6

我只是想按键分组,就像我在期望输出中所拥有的。

看起来你想创建一个 id -> object 映射。要做到这一点,你只需遍历数组,将每个对象的 id 属性作为属性名称,并将对象 (数组元素) 赋值给映射的属性。

例如:

var map = {};
var response = obj.response;

for (var i = 0, l = response.length; i < l; i++) {
    map[response[i].id] = response[i];
}

console.log(map);

数组中的每个对象已经处于您想要的结构中。输出结果为:

{
    "100": {
        "id": 100,
        "certificate": {
            "id": 1,
            "title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
        },
        "created_at": "2013-12-02T15:20:08.233Z"
    },
    "101": {
        "id": 101,
        "certificate": {
            "id": 2,
            "title": "Aenean facilisis, nisl vitae pulvinar varius."
        },
        "created_at": "2013-12-02T15:20:08.240Z" 
    }
}

0

您所需的JSON格式不正确。

不清楚您是想创建一个数组的数组还是一个数组的对象,或者其他什么。为了帮助您决定哪个选项适合您的需求,请尝试使用以下代码:

var a=[];
var o={};

for (var i=0, l=response.length; i<l; i++) {
  var e = response[i];
  a[e.id] = e.certificate;
  o[e.id] = e.certificate;
}

console.log(JSON.stringify(a));
console.log(JSON.stringify(o));

你看过 console.log(JSON.stringify(a)); 的输出吗? - Felix Kling
是的,我知道这不是OP要求的内容,但这就是我的观点。o的输出也不是。 - PA.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接