解析时如何在对象中创建数组?

时间:2014-05-10 12:50:24

标签: javascript jquery json

我正在解析JSON对象。我想设置会话中存储的值对id。我有这个JSON:

[
  {
    "id": "a",
    "text": "a",
    "icon": true,
    "li_attr": {
      "id": "a"
    },
    "a_attr": {
      "href": "#"
    },
    "state": {
      "loaded": true,
      "opened": false,
      "selected": false,
      "disabled": false
    },
    "data": {

    },
    "children": [

    ]
  },
  {
    "id": "b",
    "text": "b\n            ",
    "icon": true,
    "li_attr": {
      "id": "b"
    },
    "a_attr": {
      "href": "#"
    },
    "state": {
      "loaded": true,
      "opened": false,
      "selected": false,
      "disabled": false
    },
    "data": {

    },
    "children": [
      {
        "id": "b-a-1",
        "text": "b-a",
        "icon": true,
        "li_attr": {
          "id": "b-a-1"
        },
        "a_attr": {
          "href": "#"
        },
        "state": {
          "loaded": true,
          "opened": false,
          "selected": false,
          "disabled": false
        },
        "data": {

        },
        "children": [

        ]
      },
      {
        "id": "b-b-2",
        "text": "b-b\n                    ",
        "icon": true,
        "li_attr": {
          "id": "b-b-2"
        },
        "a_attr": {
          "href": "#"
        },
        "state": {
          "loaded": true,
          "opened": false,
          "selected": false,
          "disabled": false
        },
        "data": {

        },
        "children": [
          {
            "id": "b-b-a",
            "text": "b-b-a",
            "icon": true,
            "li_attr": {
              "id": "b-b-a"
            },
            "a_attr": {
              "href": "#"
            },
            "state": {
              "loaded": true,
              "opened": false,
              "selected": false,
              "disabled": false
            },
            "data": {

            },
            "children": [

            ]
          },
          {
            "id": "b-b-b",
            "text": "b-b-b",
            "icon": true,
            "li_attr": {
              "id": "b-b-b"
            },
            "a_attr": {
              "href": "#"
            },
            "state": {
              "loaded": true,
              "opened": false,
              "selected": false,
              "disabled": false
            },
            "data": {

            },
            "children": [

            ]
          }
        ]
      }
    ]
  },
  {
    "id": "c-1",
    "text": "c\n            ",
    "icon": true,
    "li_attr": {
      "id": "c-1"
    },
    "a_attr": {
      "href": "#"
    },
    "state": {
      "loaded": true,
      "opened": false,
      "selected": false,
      "disabled": false
    },
    "data": {

    },
    "children": [
      {
        "id": "not-c-a-1",
        "text": "c-a",
        "icon": true,
        "li_attr": {
          "id": "not-c-a-1"
        },
        "a_attr": {
          "href": "#"
        },
        "state": {
          "loaded": true,
          "opened": false,
          "selected": false,
          "disabled": false
        },
        "data": {

        },
        "children": [

        ]
      },
      {
        "id": "not-c-b-2",
        "text": "b-b",
        "icon": true,
        "li_attr": {
          "id": "not-c-b-2"
        },
        "a_attr": {
          "href": "#"
        },
        "state": {
          "loaded": true,
          "opened": false,
          "selected": false,
          "disabled": false
        },
        "data": {

        },
        "children": [

        ]
      }
    ]
  }
]

我想制作具有对象的相同类型的数组。在对象内部可能存在嵌套对象。我只想为它设置值。

我们能获得孩子们的信息吗?如果有孩子,我需要设定价值。这是我的小提琴: http://jsfiddle.net/fuu94/91/

$('#json').click(function(){
 var json_list=$('#tree').jstree(true).get_json(); console.log(json_list.length);
    for(var i=0;i<json_list.length;i++){
        var obj={};
        alert(json_list[i].id)
        obj=sessionStorage.getItem(json_list[i].id);
        arr[i]=obj;
    }

console.log(arr)

})
});

预期输出为:

[
  {
    "a": "value_a",

    "arr": [

    ]
  },
  {
    "b": "value_b",

    "arr": [
      {
        "b-a-1": "value_b-a-1",

        "arr": [

        ]
      },
      {
        "b-b-1": "value_b-b-2",

        "arr": [
          {
            "b-b-a": "value_b-b-a",

            "arr": [

            ]
          },
          {
            "b-b-b": "value_b-b-b",

            "arr": [

            ]
          }
        ]
      }
    ]
  },
  {
    "c-1": "value_c-1",

    "arr": [
      {
        "not-c-a-1": "value_not-c-a-1",

        "arr": [

        ]
      },
      {
        "not-c-b-2": "value_not-c-b-2",

        "arr": [

        ]
      }
    ]
  }
]

2 个答案:

答案 0 :(得分:1)

您可以使用传递给JSON.parse的reviver函数。

JSFIDDLE

var json = JSON.stringify([{ id: 'root', children: [ { id: 'nested' } ]}]);

var p = JSON.parse(json, function (k, v) {
    if (!k) return v;
    if (k === 'id' || k === 'children') return v;
    if (+k == k && typeof v === 'object' && v != null && 'id' in v) {
        v[v.id] = 'value_' + v.id;
        delete v.id;
        if (v.children) v.arr = v.children;
        delete v.children;
        return v;
    }
});

JSON.stringify(p); //[{"root":"value_root","arr":[{"nested":"value_nested"}]}]
编辑:我试图通过使用不同的方法使代码更加健壮,但它没有按预期工作,因为在我们开始迭代数组之前children键并不总是出现。看看编辑历史,也许我忽略了一些东西。

答案 1 :(得分:-1)

假设预期输出中的"b-b-1": "value_b-b-2"是一个类型且确实应该是"b-b-2": "value_b-b-2",那么将原始数组映射到预期输出应该非常容易。

在数组上使用map方法(或者,如果您需要支持旧浏览器,请使用您正在使用的某些库的map实现(例如jQuery或Underscore)。

对于数组中的每个项目,您需要创建一个具有两个属性的项目。应该根据输入对象的id属性的值来命名第一个属性,并且属性的值看起来应该是文字value_,后跟{{1}的值来自输入对象的属性。

此外,每个项目还应具有id属性,这是将项目映射功能应用于arr数组中的项目的结果。

所以代码看起来像

children

我在http://jsfiddle.net/tJ7Kq/

的示例数据上运行了上述映射函数