2016-08-23 60 views
0

我想从JSON中创建不同深度的jsTree(可以是10个或更多个级别)。于是我搜索了网页,并找到了创建jsTree的方法:遍历。遍历JSON对象来创建jsTree

例JSON:

{ 
    "testslave_1": { 
     "DevKey": "94ssfsafafeaw382", 
     "mapping": { 
      "device1": "D1", 
      "device2": "D2", 
      "device3": "D3" 
     } 
    } 
} 

幸运的是我有traverse-js,但我有它的问题。

这是jsTree所需的语法:

$('#using_json_2').jstree({ 'core' : { 
    'data' : [ 
     { "id" : "ajson1", "parent" : "#", "text" : "Simple root node" }, 
     { "id" : "ajson2", "parent" : "#", "text" : "Root node 2" }, 
     { "id" : "ajson3", "parent" : "ajson2", "text" : "Child 1" }, 
     { "id" : "ajson4", "parent" : "ajson2", "text" : "Child 2" }, 
    ] 
} }); 

我有这个到目前为止已经试过:

var obj = '{ "testslave_1": {  "DevKey": "94ssfsafafeaw382",  "mapping": {   "device1": "D1",   "device2": "D2",   "device3": "D3"  } }}'; 

    var obj = JSON.parse(obj); 
    var arr = []; 

    traverse(obj).map(function (x) { 

    var jsonTemp = '{ "id" : "'+this.path+'", "parent" : "'+this.parent+'", "text" : "'+this.node+'" }'; 
    jsonTemp = JSON.parse(jsonTemp); 
    arr.push(jsonTemp); 

    }); 

    console.dir(arr); 

但也有serveral的问题:如何为每个项目创建一个特定ID ? (该函数可能记住父属性的ID)

它说对象对象,如果我以正确的方式了解它,我必须访问父对象的节点。但是如何? this.parent.node不起作用。

有物品丢失,应该是10件左右。

我的解决方案是走向正确的方向吗?

预先感谢您。

回答

1

我不知道遍历js。如果你想获得某种形式的树结构像例如,你可以实现与递归函数,例如像这样的:此功能不提供

var testobj = { 
    testslave_1:{ 
     DevKey: "94ssfsafafeaw382", 
     mapping: { 
      device1:"D1", 
      device2:"D2", 
      device3:"D3" 
     } 
    } 
}; 
var tree = { 
    core: { 
     data: [] 
    } 
}; 
function createTreeData(object, parent){ 
    if(!parent){ 
     parent = "#" 
    } 
    for(var prop in object){ 
     if(object.hasOwnProperty(prop)){ 
      var obj = { 
       id: prop, 
       parent: parent 
      }; 
      if(typeof object[prop] === "object"){ 
       createTreeData(object[prop], prop); 
       obj.text = "parent node"; 
      }else{ 
       obj.text = object[prop]; 
      } 
      tree.core.data.push(obj); 
     } 
    } 
} 
createTreeData(testobj); 
console.log(tree); 

的唯一的事情是对元素文本这是父节点本身。相反,它会放入最有可能错误的子对象。但是你没有指定什么文本父节点应该包含。

编辑:我改变了功能,使父节点现在包含文本“父节点”,而不是他们的子对象。

EDIT2:新功能,这使得节点为它们只是文本属性:

function createTreeData(object, parent){ 
    if(!parent){ 
     parent = "#" 
    } 
    for(var prop in object){ 
     if(object.hasOwnProperty(prop)){ 
      tree.core.data.push({ 
       id: prop, 
       parent: parent, 
       text: prop 
      }); 
      if(typeof object[prop] === "object"){ 
       createTreeData(object[prop], prop); 
      }else{ 
       tree.core.data.push({ 
        id: object[prop], 
        parent: prop, 
        text: object[prop] 
       }); 
      } 
     } 
    } 
} 
+0

第一:谢谢!你是对的,我没有指定父母应该包含什么信息。它应该有父母本身的名称。在这种情况下,树中不存在“DevKey”。如果结构将是“testslave_1” - >“DevKey” - > 94ssfsafafeaw382,就像json结构一样,这将是完美的。我已经改变了obj.text =“父节点”; to obj.text = prop;以便其他父元素被命名为正确的。 ?如何为“” 94ssfsafafeaw382" 创建父项 它应该是这样的: http://imgur.com/a/2JKBc 在它看起来像这样的时刻: http://imgur.com/ a/OiwOH – bademeister

+0

取决于你想要的东西,如果当前的东西不正确,那么映射也是不正确的,因为device1,device2和device3没有出现在树中,那么你必须修改该功能,以便它为只包含一个值的属性创建子节点。如果映射和设备是正确的,则必须将输入JSON调整为像......“DevKey”:{“text”:“94ssfsafafeaw382”},... – Danmoreng

+0

你是对的,我忘记了添加Device1等等。 这应该是这样的:http://imgur.com/a/C33Qn 每个元素都应该在树中可见。 据我了解,它的功能必须修改,它再次运行的子节点,对不对? – bademeister