Javascript操作对象数组并为数据和链接创建两组数组
我有一个如下所示的对象数组Javascript操作对象数组并为数据和链接创建两组数组,javascript,arrays,json,Javascript,Arrays,Json,我有一个如下所示的对象数组 [ { "name": "car", "value": "", "children": [ { "name": "v8_engine", "value": "", "children": [ { "name": "cylinder-arrangement", "value": "", "c
[
{
"name": "car",
"value": "",
"children": [
{
"name": "v8_engine",
"value": "",
"children": [
{
"name": "cylinder-arrangement",
"value": "",
"children": [
{
"name": "type",
"value": "string",
"children": []
},
{
"name": "max-elements",
"value": "8",
"children": []
}
]
}
]
},
{
"name": "other-parts",
"value": "",
"children": [
{
"name": "per-cylinder-parts",
"value": "",
"children": [
{
"name": "piston-diameter",
"value": "",
"children": [
{
"name": "type",
"value": "uint32",
"children": []
},
{
"name": "range",
"value": "2000... 9000",
"children": []
}
]
},
{
"name": "valves",
"value": "",
"children": [
{
"name": "number",
"value": "",
"children": []
},
{
"name": "position",
"value": "",
"children": []
}
]
}
]
}
]
}
]
}
]
我想解析每个元素及其各自的子元素,并对其进行操作以创建两组数组
vm.tree.forEach(loop);// here vm.tree is the json data, passed dynamically
var i=0;
function loop(a) {
if(a.yang_type!='' && a.name!=''){
nodeDataArray.push({ key:i,Data: a.yang_type + " " + a.name, group: -1 });
//console.log("Data:",a.yang_type);
linkDataArray.push({ from: i, to: i+1 });
}
if(a.name!='' && a.value!=''){
nodeDataArray.push({ key:i,Data: a.name + " " + a.value, group: -1 });
linkDataArray.push({ from: 0, to: i+1 });
}
i=i+1;
// process you data
//if(Array.isArray(a.children)){j++;}
if(Array.isArray(a.children)){
//var g=0;
a.children.forEach(loop);
}
}
下面的文字基于示例JSON,以便更清楚地说明我的预期输出应该是什么
car
v8_engine
cylinder-arrangement
type string
max-elements 8
other_parts
per-cylinder-parts
piston-diameter
type UINT32
range 2000...3000
valves
number
position
0th element is parent of 1 and 5.
1st element is parent of 2
2nd element is parent of 3 and 4
and so on
要生成父列表,可以使用带有
from
变量的闭包,该变量保存从何处调用的节点号
顺便说一句,您上面的列表对于5元素是6和10的父元素是不正确的。
函数循环(从){
返回函数(a){
var f=i;
如果(从!==未定义){
push({from:from,to:i});
}
i++;
if(Array.isArray(a.children)){
a、 forEach(loop(f));
}
};
}
var数据=[{“名称”:“汽车”、“值”:“子项”:[{“名称”:“v8_引擎”、“值”:“子项”:[{“名称”:“气缸排列”、“值”:““子项”:[{“名称”:“类型”、“值”:“字符串”、“子项”:[]},{“名称”:“最大元素”、“值”:“8”、“子项”:[]}],{“名称”:“其他部分”、“值”:“,”子项:[“名称”:[{“名称”:“每缸零件”、“值”:”、“子项”:[{“名称”:“活塞直径”、“值”:“,”子项”:[{“名称”:“类型”、“值”:“uint32”,“子项”:[]},{“名称”:“范围”、“值”:“2000…9000”,“子项”:[]},{“名称”:“阀门”,“值”:“,”子项:[{“名称”:“编号”,“值”:“子项”:[]},{“位置”,“值”:”“:”“,”子项“:[]}]}]}]}]}],
i=0,
linkDataArray=[];
data.forEach(loop());
log(linkDataArray)
要生成父列表,可以使用带有from
变量的闭包,该变量保存从中调用的节点号
顺便说一句,您上面的列表对于5元素是6和10的父元素是不正确的。
函数循环(从){
返回函数(a){
var f=i;
如果(从!==未定义){
push({from:from,to:i});
}
i++;
if(Array.isArray(a.children)){
a、 forEach(loop(f));
}
};
}
var数据=[{“名称”:“汽车”、“值”:“子项”:[{“名称”:“v8_引擎”、“值”:“子项”:[{“名称”:“气缸排列”、“值”:““子项”:[{“名称”:“类型”、“值”:“字符串”、“子项”:[]},{“名称”:“最大元素”、“值”:“8”、“子项”:[]}],{“名称”:“其他部分”、“值”:“,”子项:[“名称”:[{“名称”:“每缸零件”、“值”:”、“子项”:[{“名称”:“活塞直径”、“值”:“,”子项”:[{“名称”:“类型”、“值”:“uint32”,“子项”:[]},{“名称”:“范围”、“值”:“2000…9000”,“子项”:[]},{“名称”:“阀门”,“值”:“,”子项:[{“名称”:“编号”,“值”:“子项”:[]},{“位置”,“值”:”“:”“,”子项“:[]}]}]}]}]}],
i=0,
linkDataArray=[];
data.forEach(loop());
log(linkDataArray)代码>你的代码没有做你想做的事情?它做了保存节点数据数组的第一部分,但是链接数据数组没有基于JSON映射正确的父级和子级。这不是JSON,与JSON无关。请自学什么是JSON(参见JSON.org),并重写您的问题。此外,操作对象并不是“解析”它们。“解析”一词有特定的含义,即“根据语法分析一串符号的过程”。另外,请给出一个较小的示例数据集,并修复过度缩进。您的代码不符合您的要求?它完成了保存节点数据数组的第一部分,但链接数据数组没有基于JSON映射正确的父级和子级。这不是JSON,与JSON无关。请自学什么是JSON(参见JSON.org),并重写您的问题。此外,操作对象并不是“解析”它们。“解析”一词有特定的含义,即“根据语法分析一串符号的过程”。另外,请给出一个较小的示例数据集,并修复您的过度缩进。我看到您喜欢a&&do\u something
习惯用法,但普通人编写if
语句<代码>&&
具有逻辑and的语义。此外,很多(如果不是大多数的话)Linter都会被这种语法扼杀。对,我喜欢这种简短的语法。现在好多了吗?谢谢你招待了一个脾气暴躁的老家伙。@torazaburo。。谢谢你,先生!!!我看你喜欢a&&do\u something
这个成语,但是普通人写if
语句<代码>&&
具有逻辑and的语义。此外,很多(如果不是大多数的话)Linter都会被这种语法扼杀。对,我喜欢这种简短的语法。现在好多了吗?谢谢你招待了一个脾气暴躁的老家伙。@torazaburo。。谢谢你,先生!!!
var i=0;
var nodeDataArray = [];
var linkDataArray = [];
function loop(from) {
return function (a) {
var f = i;
if(a.yang_type!='' && a.name!=''){
nodeDataArray.push({ key:i,Data: a.yang_type + " " + a.name, group: -1 });
//c=c+a.name;
//console.log("c:",c);
//console.log("Data:",a.yang_type);
//linkDataArray.push({ from: i, to: i+1 });
}
if(a.name!='' && a.value!=''){
nodeDataArray.push({ key:i,Data: a.name + " " + a.value, group: -1 });
//c=c+a.name+a.value;
console.log("c:",c);
//linkDataArray.push({ from: 0, to: i+1 });
}
if (from !== undefined) {
linkDataArray.push({ from: from, to: i });
}
i++;
if (Array.isArray(a.children)) {
a.children.forEach(loop(f));
}
//console.log("c:",c);
};
}
var data = [{ "name": "car", "value": "", "children": [{ "name": "v8_engine", "value": "", "children": [{ "name": "cylinder-arrangement", "value": "", "children": [{ "name": "type", "value": "string", "children": [] }, { "name": "max-elements", "value": "8", "children": [] }] }] }, { "name": "other-parts", "value": "", "children": [{ "name": "per-cylinder-parts", "value": "", "children": [{ "name": "piston-diameter", "value": "", "children": [{ "name": "type", "value": "uint32", "children": [] }, { "name": "range", "value": "2000... 9000", "children": [] }] }, { "name": "valves", "value": "", "children": [{ "name": "number", "value": "", "children": [] }, { "name": "position", "value": "", "children": [] }] }] }] }] }]
data.forEach(loop());