Javascript 解析时如何在对象中生成数组?
我正在解析JSON对象。我想根据id设置存储在会话中的值。我有以下JSON:Javascript 解析时如何在对象中生成数组?,javascript,jquery,json,Javascript,Jquery,Json,我正在解析JSON对象。我想根据id设置存储在会话中的值。我有以下JSON: [ { "id": "a", "text": "a", "icon": true, "li_attr": { "id": "a" }, "a_attr": { "href": "#" }, "state": { "loaded": true, "opened": false, "selecte
[
{
"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": [
]
}
]
}
]
我想使相同类型的数组具有对象。对象内部可能存在嵌套对象。我只想根据它的id设置值
我们能得到孩子们的信息吗?如果有子项,我需要设置值。这是我的小提琴:
您可以使用传递给
JSON.parse
的恢复器函数
编辑:我试图通过使用不同的方法使代码更加健壮,但它没有像预期的那样工作,因为在我们开始迭代数组之前,子项
键并不总是出现。看看编辑历史记录,也许我忽略了什么。假设预期输出中的“b-b-1”:“value_b-b-2”
是一种类型,实际上应该是“b-b-2”:“value_b-b-2”
将原始数组映射到预期输出应该非常容易
在数组上使用map
方法(或者,如果您需要支持较旧的浏览器,请使用您正在使用的某些库的map
实现(例如jQuery或下划线)
对于数组中的每个项,您需要创建一个具有两个属性的项。第一个属性应根据输入对象的id
属性的值命名,该属性的值似乎应该是文本value\uu
,然后是来自t的id
属性的值他输入对象
此外,每个项还应具有arr
属性,这是将项映射函数应用于子项
数组中的项的结果
所以代码可能看起来像
function mapItem(inputItem){
var item = {};
item[inputItem.id] = "value_" + inputItem.id;
item.arr = inputItem.children.map(mapItem);
return item;
};
var results = originalArray.map(mapItem);
我在处对您的样本数据运行了上述映射函数,您的预期输出对我来说没有任何意义。有时您有
arr
和子对象
。有时arr
是一个数组,有时是一个字符串。您需要更好地解释您试图实现的转换类型e、 您只需给出一个简单的示例,说明1个具有子节点的初始节点以及该节点应如何转换。还应包括相关属性。@plalx抱歉,请检查我的更新。抱歉..这是一个“arr”不是孩子我将更新我的问题arr始终是数组而不是字符串..我只是制作自己的..它与原始相同只是将名称从孩子更改为arrI只是从会话中获取值,但在数组上,请给出fiddle@user944513我编辑了答案并提供了一个提琴。虽然代码肯定更复杂,但这将转换解析时使用structure,而不是解析后转换它的其他解决方案。@plax你能看看这个问题吗@user944513我试图避免这些wierd条件,以使函数更健壮(例如,如果有多个数组,则无法正常工作),但不知何故,JSON.parse在它的迭代中似乎并不一致。请看一下历史上这个answser的编辑版本。也许我忽略了什么。我认为在解析时需要OP。那是在解析之后。@robert你能看看这个问题吗@plalx你完全正确,问题的标题是这样说的然而,我认为, map > /Cuff>方法更容易阅读,而且在尝试解析代码时,数组必须非常大,这比我们在如何解决OP问题时提供两个不同的建议,这样OP可以选择。请承认,我在写自己的答案时遗漏了关于“解析时”的部分,这就是为什么我对你的答案投了更高的票。但是,我仍然认为,在我将映射作为解析的一部分而不是将它们分开之前,数组必须非常大。
[
{
"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": [
]
}
]
}
]
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"}]}]
function mapItem(inputItem){
var item = {};
item[inputItem.id] = "value_" + inputItem.id;
item.arr = inputItem.children.map(mapItem);
return item;
};
var results = originalArray.map(mapItem);