Javascript 遍历JSON对象以创建jsTree

Javascript 遍历JSON对象以创建jsTree,javascript,json,jstree,traversal,tree-traversal,Javascript,Json,Jstree,Traversal,Tree Traversal,我想从JSON创建一个不同深度的jsTree(可以是10级或更多级别)。因此,我搜索了web并找到了创建jsTree的方法:遍历 示例JSON: { "testslave_1": { "DevKey": "94ssfsafafeaw382", "mapping": { "device1": "D1",

我想从JSON创建一个不同深度的jsTree(可以是10级或更多级别)。因此,我搜索了web并找到了创建jsTree的方法:遍历

示例JSON:

{
    "testslave_1": {
        "DevKey": "94ssfsafafeaw382",
        "mapping": {
            "device1": "D1",
            "device2": "D2",
            "device3": "D3"
        }
    }
}
$('#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" },
    ]
} });
幸运的是我有,但我有问题

这是jsTree所需的语法:

{
    "testslave_1": {
        "DevKey": "94ssfsafafeaw382",
        "mapping": {
            "device1": "D1",
            "device2": "D2",
            "device3": "D3"
        }
    }
}
$('#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);
但是有几个问题:如何为每个项目创建一个特定的ID?(函数可能会记住父属性的id)

它说的是对象对象,如果我以正确的方式理解它,我必须访问父对象的节点。但是怎么做呢?此.parent.node不工作

少了一些物品,应该是10件左右

我的解决方案方向正确吗


提前谢谢你。

我不知道你的名字。如果您想获得类似于示例的某种树结构,可以使用递归函数实现,例如:

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]
                });
            }
        }
    }
}

第一:谢谢!你是对的,我没有指定家长应该包含哪些信息。它应该有父对象本身的名称。在这种情况下,“DevKey”不在树中。如果结构是“testslave_1”->“DevKey”->94ssfsafeaw382,就像json结构一样,那就太完美了。我已更改obj.text=“父节点”;to obj.text=prop;这样其他父元素的名称就正确了。如何为“”94SSFSAFEAW382创建父项"? 它应该是这样的:目前看起来是这样的:取决于你到底想要什么。如果当前设备不正确,那么映射也不正确,因为device1、device2和device3没有显示在树中。然后,您必须修改该函数,以便它为仅包含值的属性生成子节点。如果映射和设备是正确的,那么您必须将输入JSON调整为。。。“DevKey”:{“text”:“94ssfsafeaw382”},…你是对的,我忘记添加设备1等等。它应该是这样的:树中的每个元素都应该是可见的。据我所知,必须修改函数,使其为子节点运行另一次,对吗?我不会让它为子节点运行另一次,但如果属性不是对象而是文本,则让它创建第二个树元素。我在函数的第二个版本中进行了编辑。