javascript 将嵌套字典转换为树状数组结构

javascript convert nested dictionary to tree like array structure

我有一个字符串输入示例,格式为 - "a.b.c"、"a.d.e" 等

我想转换以“.”分隔的字符串部分以树状结构表示。

所以,我写了下面的函数来从这样的输入数组创建一个嵌套的字典对象 -

function items_to_tree(items) {
    var arr = {};
    items.forEach(function(item){
        var parts = item.split(".");
        var last = parts.pop();
        var cursor = arr;
        parts.forEach(function(part){
            if(!cursor[part]) cursor[part] = {};
            cursor = cursor[part];
        });
        cursor[last] = {};
    });
    return arr;
}

因此,例如,如果我将以下示例输入提供给此函数 -

var items = ["a.b", "a.c", "b.c", "a.c", "a.c.d", "a.b.d"]

我按预期得到了 {"a":{"b":{"d":{}},"c":{"d":{}}},"b":{"c":{}}}

但是,我希望输出的格式与此类似 -

[{name: "a", children: [{name: "b", children: [{name: "d", children: []}]}]}, {name: "c", children: [{name: "d", children: []}]}, {name: "b", children: [{name: "c", children: []}]}]

有什么方法可以将 items_to_tree 函数修改为 return 这样的输出,或者 items_to_tree 的中间输出可以吗 [嵌套字典]被转化为这棵树状javascript对象数组。

您可以在嵌套数组中搜索给定名称并使用该对象或创建一个新对象。

var items = ["a.b", "a.c", "b.c", "a.c", "a.c.d", "a.b.d"],
    result = [];

items.forEach(function (path) {
    path.split('.').reduce(function (level, key) {
        var temp = level.find(({ name }) => key === name);
        if (!temp) {
            temp = { name: key, children: [] };
            level.push(temp);
        }
        return temp.children;
    }, result);
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

我会为最终的数据转换编写第二个函数。您的 items_to_tree 非常通用且可重复使用。只需几行即可将此树转换为所需格式:

function tree_to_format(tree) {
  return Object
    .keys(tree)
    .map(k => ({ name: k, children: tree_to_format(tree[k]) }))
};

现在,您可以通过将 items_to_tree 的结果管道化到 tree_to_format 组合 您需要的函数:

function items_to_tree(items) {
    var arr = {};
    items.forEach(function(item){
        var parts = item.split(".");
        var last = parts.pop();
        var cursor = arr;
        parts.forEach(function(part){
            if(!cursor[part]) cursor[part] = {};
            cursor = cursor[part];
        });
        cursor[last] = {};
    });
    return arr;
}

function tree_to_format(tree) {
  return Object
    .keys(tree)
    .map(k => ({ name: k, children: tree_to_format(tree[k]) }))
};

console.log(
  tree_to_format(
    items_to_tree(["a.b", "a.c", "b.c", "a.c", "a.c.d", "a.b.d"])
  )
);

// or even:
const compose = (f, g) => x => f(g(x));
const items_to_format = compose(tree_to_format, items_to_tree);