繁体   English   中英

将对象列表转换为json树结构

[英]Convert a list of objects to a json tree structure

我有一个列表,需要将其转换为json格式。

这个..

var sourceList = [
    { title: "item-1", indent: "0" },
    { title: "item-2", indent: "0" },
    { title: "item-3", indent: "0", folder: true },
    { title: "item-4", indent: "1" },
    { title: "item-5", indent: "1", folder: true },
    { title: "item-6", indent: "2" },
    { title: "item-7", indent: "2" },
    { title: "item-8", indent: "0" }
];

对此。

var targetJson = [
    { title: "item-1" },
    { title: "item-2" },
    { title: "item-3", folder: true, children: [
        { title: "item-4" },
        { title: "item-5", folder: true, children: [
            { title: "item-6" },
            { title: "item-7" }
        ]},
    ]},
    { title: "item-8" }
];

因此结果可以用于初始化如下所示的树结构。

    item-1
    item-2
    item-3
    .. item-4
    .. item-5
    .... item-6
    .... item-7
    item-8

每个源对象的'indent'属性确定其相对于前一个对象的位置。

就像如果对象的缩进大于先前的缩进一样,则将其视为先前的子代,如果它与先前的缩进相同,则将其视为先前的同级。 因此,子属性和文件夹属性将出现在具有子项的节点上。

挑战之一是“项目8”,该项目的级别为0,而上一个项目为2。

需要解决方案,最好是使用javascript。

我在缩进和添加子元素的元素之间保持了映射:

// test data
var sourceList = [
    { title: "item-1", indent: "0" },
    { title: "item-2", indent: "0" },
    { title: "item-3", indent: "0", folder: true },
    { title: "item-4", indent: "1" },
    { title: "item-5", indent: "1", folder: true },
    { title: "item-6", indent: "2" },
    { title: "item-7", indent: "2" },
    { title: "item-8", indent: "0" }
];

// init
var targetJson = [];
var roots = { 0 : targetJson};

// actual code:
sourceList.forEach(function(item){
  if (!roots[item.indent].splice) {
    roots[item.indent] = roots[item.indent].children = [];
  }
  roots[item.indent].push(item);
  if (item.folder) {
    roots[+item.indent+1] = item;
  }
});

// output
console.log(targetJson);

PS:我将indent属性保留在对象中,以便您可以检查结果。 添加项目后,请随时将其删除。 这是无关紧要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM