如何在javascript中计算对象中的子项?

时间:2016-01-29 14:44:02

标签: javascript jquery

我有一个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/

回答不工作..

3 个答案:

答案 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)
}

https://jsfiddle.net/nk6v0y36/3/

答案 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)
  }
}

检查控制台日志中的输出以查看它是否正确:)