javascript - 将按 ASCII 顺序排序的一维数组转换为 Javascript 中的嵌套数组

标签 javascript arrays jstree

假设下面的对象数组按 code 属性以 ascii 顺序排序:

var codes = [
    { code: '01' },
    { code: '0101' },
    { code: '0102' },
    { code: '010201' },
    { code: '0103' },
    { code: '02' },
    { code: '0201' },
    { code: '0202' },
];

我怎样才能把它转换成这样的嵌套数组:

var nestedCodes = [
    {
        code: '01',
        children: [
            { code: '0101' },
            {
                code: '0102',
                children: [
                    { code: '010201' }
                ]
            },
            { code: '0103' }
        ]
    },
    {
        code: '02',
        children: [
            { code: '0201' },
            { code: '0202' }
        ]
    }
];

代码的结构就像连接多个0NN可以是1到9之间的数字。注意代码来自服务器,会有一些额外的属性在 code 旁边,如 title 但在这个问题中并不重要。

这里的主要思想是为 jsTree 制作一个合适的格式.

最佳答案

您可以使用递归解决方案来做到这一点。这个想法是维护路径(使用正则表达式通过String.prototype.match作为数组获得)和父级,您要在其下插入代码 用于每个递归调用。

parent 跟踪您要在“当前”递归调用中选择的节点,path 有助于构建parent当你继续深入时:

function insert(d, path, parent, arr) {
  if (path.length === 0) {
    arr.push(Object.assign({}, d));
    return;
  }
  var target = arr.find(e => e.code === parent);
  target.children = target.children || [];
  insert(d, path.slice(1), parent + path[0], target.children);
}

var codes = [
    { code: '01' },
    { code: '0101' },
    { code: '0102' },
    { code: '010201' },
    { code: '0103' },
    { code: '02' },
    { code: '0201' },
    { code: '0202' },
];

var res = codes.reduce((a, c) => {
  var p = c.code.match(/(0[1-9])/g);
  insert(c, p.slice(1), p[0], a);
  return a;
}, []);

console.log(res);

当然,假设是当一个 code 被插入时,它的父级已经被插入了。

关于javascript - 将按 ASCII 顺序排序的一维数组转换为 Javascript 中的嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53493545/

相关文章:

javascript - 全日历时刻 : Getting current time plus 2 hours

Javascript - 在数组中查找 2 个项目?

javascript - 使用 JSON 填充 jstree

javascript - 在javascript中自定义排序

javascript - 如何在创建时设置节点的类型?

javascript - 如何在jstree中获取父对象和父对象的父id

javascript - 如何在 Greasemonkey 中将一串文本着色为红色?

javascript - 通过按钮按下相同的随机图像

javascript - Firebase 弹出窗口登录弹出窗口被用户关闭错误

c - 指向结构体元素的指针