Javascript 如何将这个json数据转换成js中的键、值对数组?
我有一个嵌套的json数据,其中每个父对象都有一个数组或对象作为子对象,我尝试了一种简单的方法,迭代json数据以获得键:值形式,但代码的复杂性和可读性都不是最优的。有人能提出一种方法来降低这个问题的复杂性,以获得期望的结果吗 所需的输出是一个对象数组,其中每个对象都有一个键和一个值。密钥名称是有效负载中的密钥值,按照点表示法,其前面带有其父名称。还有一个主要的限制是我们不确定哪个子元素可以进一步嵌套。有没有一种方法可以避免如此多的循环嵌套以访问子元素 这是由嵌套对象和数组组成的json有效负载(数据):Javascript 如何将这个json数据转换成js中的键、值对数组?,javascript,arrays,json,typescript,Javascript,Arrays,Json,Typescript,我有一个嵌套的json数据,其中每个父对象都有一个数组或对象作为子对象,我尝试了一种简单的方法,迭代json数据以获得键:值形式,但代码的复杂性和可读性都不是最优的。有人能提出一种方法来降低这个问题的复杂性,以获得期望的结果吗 所需的输出是一个对象数组,其中每个对象都有一个键和一个值。密钥名称是有效负载中的密钥值,按照点表示法,其前面带有其父名称。还有一个主要的限制是我们不确定哪个子元素可以进一步嵌套。有没有一种方法可以避免如此多的循环嵌套以访问子元素 这是由嵌套对象和数组组成的json有效负载
[{
"id": {
"no": null,
"uid": null,
"dataBody": {
"area": "Universe",
"place": "LMN",
"information1": [{
"code": "abc",
"group": "xyz",
"data": [{
"definition": {
"type": "up",
"features": {
"featurekey": "ABC",
"featureValues": null
},
"mandatory": true,
},
"cost": {
"currency": "USD",
"value": 1,
}
},
{
"definition": {
"type": "down",
"mandatory": true,
},
"cost": "100"
},
{
"definition": {
"type": "left",
"value": null,
"mandatory": true,
},
"cost": false
}
],
}],
"hobby": {
"indoor": false,
"outdoor": true,
},
"petName": "Tiger",
},
"details": "detail",
"phone": "contact"
}
}]
代码:
您可以使用递归来列出它们
[
{
"name": "data.0.id.no",
"value": null
},
{
"name": "data.0.id.uid",
"value": null
},
{
"name": "data.0.id.dataBody.area",
"value": "Universe"
},
{
"name": "data.0.id.dataBody.place",
"value": "LMN"
},
{
"name": "data.0.id.dataBody.information1.0.code",
"value": "abc"
},
{
"name": "data.0.id.dataBody.information1.0.group",
"value": "xyz"
},
{
"name": "data.0.id.dataBody.information1.0.data.0.definition.type",
"value": "up"
},
{
"name": "data.0.id.dataBody.information1.0.data.0.definition.features.featurekey",
"value": "ABC"
},
{
"name": "data.0.id.dataBody.information1.0.data.0.definition.features.featureValues",
"value": null
},
{
"name": "data.0.id.dataBody.information1.0.data.0.definition.mandatory",
"value": true
},
{
"name": "data.0.id.dataBody.information1.0.data.0.cost.currency",
"value": "USD"
},
{
"name": "data.0.id.dataBody.information1.0.data.0.cost.value",
"value": 1
},
{
"name": "data.0.id.dataBody.information1.0.data.1.definition.type",
"value": "down"
},
{
"name": "data.0.id.dataBody.information1.0.data.1.definition.mandatory",
"value": true
},
{
"name": "data.0.id.dataBody.information1.0.data.1.cost",
"value": "100"
},
{
"name": "data.0.id.dataBody.information1.0.data.2.definition.type",
"value": "left"
},
{
"name": "data.0.id.dataBody.information1.0.data.2.definition.value",
"value": null
},
{
"name": "data.0.id.dataBody.information1.0.data.2.definition.mandatory",
"value": true
},
{
"name": "data.0.id.dataBody.information1.0.data.2.cost",
"value": false
},
{
"name": "data.0.id.dataBody.hobby.indoor",
"value": false
},
{
"name": "data.0.id.dataBody.hobby.outdoor",
"value": true
},
{
"name": "data.0.id.dataBody.petName",
"value": "Tiger"
},
{
"name": "data.0.id.details",
"value": "detail"
},
{
"name": "data.0.id.phone",
"value": "contact"
}
]
职能:
var output = Array();
function iterate(data, name, output)
{
for(let key in data)
{
let value = data[key];
if(value != null && (typeof(value) == "object" || typeof(value) == "array"))
{
iterate(value, name + "." + key, output);
}
else
{
output.push({name:name + "." + key, value:value});
}
}
}
iterate(data, "data", output);
console.log("Output", JSON.stringify(output, 0, 2));
[
{
"name": "data.0.id.no",
"value": null
},
{
"name": "data.0.id.uid",
"value": null
},
{
"name": "data.0.id.dataBody.area",
"value": "Universe"
},
{
"name": "data.0.id.dataBody.place",
"value": "LMN"
},
{
"name": "data.0.id.dataBody.information1.0.code",
"value": "abc"
},
{
"name": "data.0.id.dataBody.information1.0.group",
"value": "xyz"
},
{
"name": "data.0.id.dataBody.information1.0.data.0.definition.type",
"value": "up"
},
{
"name": "data.0.id.dataBody.information1.0.data.0.definition.features.featurekey",
"value": "ABC"
},
{
"name": "data.0.id.dataBody.information1.0.data.0.definition.features.featureValues",
"value": null
},
{
"name": "data.0.id.dataBody.information1.0.data.0.definition.mandatory",
"value": true
},
{
"name": "data.0.id.dataBody.information1.0.data.0.cost.currency",
"value": "USD"
},
{
"name": "data.0.id.dataBody.information1.0.data.0.cost.value",
"value": 1
},
{
"name": "data.0.id.dataBody.information1.0.data.1.definition.type",
"value": "down"
},
{
"name": "data.0.id.dataBody.information1.0.data.1.definition.mandatory",
"value": true
},
{
"name": "data.0.id.dataBody.information1.0.data.1.cost",
"value": "100"
},
{
"name": "data.0.id.dataBody.information1.0.data.2.definition.type",
"value": "left"
},
{
"name": "data.0.id.dataBody.information1.0.data.2.definition.value",
"value": null
},
{
"name": "data.0.id.dataBody.information1.0.data.2.definition.mandatory",
"value": true
},
{
"name": "data.0.id.dataBody.information1.0.data.2.cost",
"value": false
},
{
"name": "data.0.id.dataBody.hobby.indoor",
"value": false
},
{
"name": "data.0.id.dataBody.hobby.outdoor",
"value": true
},
{
"name": "data.0.id.dataBody.petName",
"value": "Tiger"
},
{
"name": "data.0.id.details",
"value": "detail"
},
{
"name": "data.0.id.phone",
"value": "contact"
}
]
var output = Array();
function iterate(data, name, output)
{
for(let key in data)
{
let value = data[key];
if(value != null && (typeof(value) == "object" || typeof(value) == "array"))
{
iterate(value, name + "." + key, output);
}
else
{
output.push({name:name + "." + key, value:value});
}
}
}
iterate(data, "data", output);
console.log("Output", JSON.stringify(output, 0, 2));