2017-03-16 102 views
0

我是软件领域的新手。我有一个json阵列的对象像将一种形式的JSON数组转换为另一种形式?

var treeObj = [ 
     { 
     "name": "sriram", 
     "refernce_id": "SAN001", 
     "sponer_id": "SAN000" 
     }, 
     { 
     "name": "neeraja", 
     "refernce_id": "SAN002", 
     "sponer_id": "SAN001" 
     }, 
     { 
     "name": "upender", 
     "refernce_id": "SAN003", 
     "sponer_id": "SAN001" 
     }, 
     { 
     "name": "manoj", 
     "refernce_id": "SAN004", 
     "sponer_id": "SAN002" 
     }, 
     { 
     "name": "shirisha", 
     "refernce_id": "SAN005", 
     "sponer_id": "SAN002" 
     }, 
     { 
     "name": "ragu", 
     "refernce_id": "SAN006", 
     "sponer_id": "SAN003" 
     }, 
     { 
     "name": "santhu", 
     "refernce_id": "SAN007", 
     "sponer_id": "SAN003" 
     } 
    ]; 

在这里,我将通过上述对象的函数。在那个函数中,我需要在每个对象中将引用ID与sponer_id进行比较,如果它们相等,我们需要将它们推入一个数组,我们将其称为子对象,就像下面一样,我们需要再次检查子数组中的引用ID in存在于上述对象的sponer_id中,如果它再次存在,我们需要将它们推送到子数组中,将其放入包含reference_id的对象中。最终的数组对象看起来像。

[ 
    { 
    "name": "sriram", 
    "parent": null, 
    "children": [ 
     { 
     "name": "neeraja", 
     "parent": "sriram", 
     "children": [ 
      { 
      "name": "manoj", 
      "parent": "neeraja" 
      }, 
      { 
      "name": "shirisha", 
      "parent": "neeraja" 
      } 
     ] 
     }, 
     { 
     "name": "upender", 
     "parent": "sriram", 
     "children": [ 
      { 
      "name": "ragu", 
      "parent": "neeraja" 
      }, 
      { 
      "name": "santhu", 
      "parent": "neeraja" 
      } 
     ] 
     } 
    ] 
    } 
] 

这里sriram的treeObj参考ID在neeraja和upender对象中作为sponder id存在。所以neeraja和upender成为孩子对斯里兰卡。 neeraja的reference_id在treeObj的manoj和shirisha对象中作为sponer_id存在。同时孩子可以有更多的孩子对象,我们需要动态地格式化对象。

这是我写的模样

var mainArr = [], subArrs = [], subObj={}, subIds = [], find = "SAN001"; 
    formatData(treeObj); 
    function formatData(treeObj){debugger; 
     var arr = []; 
     for(var x=0; x<= treeObj.length-1; x++){debugger; 
      var sampData = treeObj[x]; 
      if(find == sampData.sponer_id){ 
       arr.push(sampData.refernce_id); 
       subArrs.push(sampData); 
      } 
     } 
     subIds.push(arr); 
     console.log(subIds); 
     console.log(subArrs); 
     formatData(subArrs); 
    } 

功能请指导我在哪里出了错。提前致谢。

+1

'Java'不是'JavaScript' – Smit

回答

0
//1. find all items the have no parent and push them on a stack like so: 

let stack = treeObj.reduce((list, item) => { 
    if (<ids match>) list.push(item); 
    return item; 
}, []), 

let result = [].concat(stack); 

//2. while loop the stack: 

while (stack.length > 0) { 
    let item = stack.shift(); 

    item.children = treeObj.reduce((list, child) => { 
    if (<ids match>) { 
     list.push(child); 
    } 
    return list; 
    }, []).map(child => { 
     child.parent = item; 
     stack.unshift(item); 
     return child; 
    }); 
} 

return result; 

UPDATE

所以在»好老JS«与一些改进:

var stack = treeObj.filter(function (item) { 
    return item.<parent_id> === item.<child_id> }); 

var result = [].concat(stack); 

while (stack.length > 0) { 
    var item = stack.shift(); 

    item.children = treeObj.filter(function (child) { 
    return item.<id> === child.<parent_id>; 
    }); 

    item.children.forEach(function (child) { stack.unshift(child) }); 
} 

基本上是:

  1. 找到根(S)和保存在堆栈上
  2. while.length > 0

    1. shift()从堆栈中的第一项
    2. 找到堆栈
  3. 完成

添加parent属性关于该项目的所有儿童和unshift他们项目或删除不需要的项目可以在循环中完成。整个事情也可以通过递归来完成,但是我曾经通过做这样的事情来执行“太多的递归错误”,所以我更喜欢迭代方法。当然,您可以使用常规循环,而不是.reduce.filter.forEach,但我更喜欢功能样式。总而言之,不管你怎么做,都没有那么困难,只要先找到要素,然后再与所有的孩子一起重复等等。利用while循环找到所有的孩子,或者以该元素作为根的整个子树。

祝你好运!

+0

感谢您的回复,philip。但我得到的错误为 未捕获SyntaxError:让不允许作为词汇绑定名称 –

+0

这是ES6,JS的新版本。 – philipp

+0

非常感谢你philip ... :)你的逻辑像魅力一样工作。 –

0

你基本上试图将数组转换为n元树。

将您的原始树函数输入到formatData中,将为您提供一个数组(arr),其中所有具有SAN001作为父项的对象的referenceID和具有所有具有sponserId SAN001的子项的另一个数组(子Arrs)。

然后,您将arr存储在subIds,log subIds和subArr中,并继续递归调用subArrs上的格式数据。然后检查subArr哪些对象具有“SAN001作为前驱”(应该是当时的所有对象)并将该对象推入到subArr中。如果我没有弄错,这会导致无限循环。

改进起点: 你是“发现”变量不会改变,它是硬连线到“SAN001” - 这可能是你的第一次旅行可以,当你100%确定根对象总是这个referenceID。但在第二次旅行中,您想要检查哪些对象依赖于第二级元素,因此您需要将find设置为对应的referenceId。

您的subArrs包含取决于SAN001的所有对象。但在第二次和随后的行程中,您不想让SAN001的孩子,而是孩子在subArr中的对象。因此,您需要遍历旧对象,找到subArr中的对象的子对象,而不是遍历正在寻找SAN001的子对象的子对象。

希望清楚一点点。

暗示进一步的研究:你基本上试图用JavaScript来“将数组转换为n元树”。