我有一个json数组..我想重构json对象..但我无法按预期输出。我想搜索所有项目或对象并插入父项的子项..我试试这样
https://jsfiddle.net/nk6v0y36/1/
var new_Arry = [];
for (var i = 0; i < arry.length; i++) {
var obj = {};
var childeren = [];
obj.con_id = arry[i].con_id;
obj.children = [{
con_to: arry[i].con_to
}];
new_Arry.push(obj)
}
console.log(new_Arry)
预期产出:
[{
"con_id": 11,
"children": [{
"con_to": 12
}]
}, {
"con_id": 12,
"children": [{
"con_to": 13
}, {
"con_to": 14
}]
}, {
"con_id": 13,
"children": []
}, {
"con_id": 14,
"children": [{
"con_to": 15
}]
}, {
"con_id": 15,
"children": [{
"con_to": 16
}]
}, {
"con_id": 16,
"children": []
}]
回答后
https://jsfiddle.net/nk6v0y36/7/
回答不工作..
答案 0 :(得分:1)
正如thisOneGuy所说,你没有检查新数组中是否已经存在con_id,因此对于旧数组中的每个元素,你要创建一个相应的新元素。您的预期输出显示您希望将这些多个con_id值合并到一个对象中。
你也在子数组中创建具有con_to属性的对象,即使没有这样的属性,你的预期输出也表明你不会这样做。
解决此问题的一种方法是:
var new_Arry = [];
var new_Hash = [];
for (var i = 0; i < arry.length; i++) {
if (new_Hash[arry[i].con_id] === undefined ) {
var obj = {
con_id: arry[i].con_id,
children: []
};
if( arry[i].con_to !== undefined ) {
obj.children.push({ con_to: arry[i].con_to });
}
new_Hash[obj.con_id] = new_Arry.push(obj) - 1;
} else if( arry[i].con_to !== undefined ) {
new_Arry[new_Hash[arry[i].con_id]].children.push({ con_to: arry[i].con_to });
}
}
console.log(new_Arry);
这里的关键是new_Hash数组,它使用con_id值作为其键,并将相应的索引存储在new_Arry中作为其值。
因此,对于arry中的每个con_id,它首先检查new_Hash以查看是否有条目。如果没有,则new_Arry中没有条目,因此它会创建一个新条目。
首先创建基本对象,使用con_id和children数组。然后检查arry中是否存在con_to属性,并且只有在它存在时才将其作为对象添加到子数组中。
然后将此对象添加到new_Arry并更新new_Hash,以便con_id的元素引用新的new_Arry索引。当.push()
方法返回扩展数组并返回新数组长度时,新索引将始终为此值减去1。
但是,如果在new_Hash中找到con_id的条目,那么您只需要将con_to值添加到现有的children数组中。虽然假设arry中有多个con_id条目,但它们必须包含con_to值,但它也会检查这是安全的。 new_Hash[arry[i].cond_id]
返回的new_Arry的索引号。
顺便提一下,显式检查undefined
而不是查看值是等于true还是false来检查其存在的原因是con_id或con_to值为0将被视为false并跳过。
答案 1 :(得分:0)
喜欢这个 -
var new_Arry = [];
for (var i = 0; i < arry.length; i++) {
var obj = {};
var childeren = [];
obj.con_id = arry[i].con_id;
var child = [];
var childrenObj = {};
childrenObj.con_to = arry[i].con_to;
child.push(childrenObj);
obj.children = child;
new_Arry.push(obj)
}
答案 2 :(得分:0)
以下是正确输出的正确答案:https://jsfiddle.net/nk6v0y36/4/
基本上你需要遍历你的数组以检查con_id是否存在于该数组中,如果存在,只需添加到子节点,如果它没有添加新对象。
var new_Arry = [];
for (var i = 0; i < arry.length; i++) {
var obj = {};
var childeren = [];
if (new_Arry.length > 0) {
console.log('start')
console.log(new_Arry.length);
var thisBool = false;
for (var j = 0; j <= new_Arry.length; j++) {
console.log('inside')
if (new_Arry[j]) {
if (new_Arry[j].con_id === arry[i].con_id) {
console.log('has children')
new_Arry[j].children[new_Arry[j].children.length] = {
con_to: arry[i].con_to
}
} else {
thisBool = true;
}
}
}
if(thisBool){
obj.con_id = arry[i].con_id;
obj.children = [{
con_to: arry[i].con_to
}];
new_Arry.push(obj)
}
} else {
console.log('no children')
obj.con_id = arry[i].con_id;
obj.children = [{
con_to: arry[i].con_to
}];
new_Arry.push(obj)
}
}
检查控制台日志中的输出以查看它是否正确:)