Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript将嵌套字典转换为树状数组结构_Javascript_Arrays_Dictionary_Tree_Transformation - Fatal编程技术网

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

javascript将嵌套字典转换为树状数组结构,javascript,arrays,dictionary,tree,transformation,Javascript,Arrays,Dictionary,Tree,Transformation,我有一个字符串输入示例,格式为“a.b.c”、“a.d.e”等 我想将以“.”分隔的字符串部分转换为树结构 因此,我编写了下面的函数来从这样一个输入数组创建一个嵌套的dictionary对象- function items_to_tree(items) { var arr = {}; items.forEach(function(item){ var parts = item.split("."); var last = parts.pop();

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

我想将以“.”分隔的字符串部分转换为树结构

因此,我编写了下面的函数来从这样一个输入数组创建一个嵌套的dictionary对象-

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"]
我得到了预期的{code>{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函数以返回此类输出,或者 是否可以从项目\u到\u树的中间输出
[嵌套字典]可以转换为这种树状javascript对象数组。

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

var项目=[“a.b”、“a.c”、“b.c”、“a.c”、“a.c.d”、“a.b.d”],
结果=[];
items.forEach(函数(路径){
path.split('.').reduce(函数(级别,键){
var temp=level.find(({name})=>key==name);
如果(!temp){
temp={name:key,子项:[]};
水平推力(温度);
}
返回临时儿童;
},结果);
});
控制台日志(结果)

。作为控制台包装{max height:100%!important;top:0;}
我将为最终数据转换编写第二个函数。您的
项到树
非常通用且可重用。可以通过几行代码将此树转换为所需格式:

function tree_to_format(tree) {
  return Object
    .keys(tree)
    .map(k => ({ name: k, children: tree_to_format(tree[k]) }))
};
现在,您可以通过将
项的结果管道化到树
到格式
来编写所需的函数:

功能项到树(项){
var arr={};
items.forEach(功能(项目){
var零件=项目拆分(“.”);
var last=parts.pop();
var=arr;
部分。forEach(功能(部分){
如果(!cursor[part])cursor[part]={};
光标=光标[部分];
});
游标[last]={};
});
返回arr;
}
函数树\u到\u格式(树){
返回对象
.钥匙(树)
.map(k=>({name:k,children:tree_to_格式(tree[k])}))
};
console.log(
树到树格式(
项目到目录树([“a.b”,“a.c”,“b.c”,“a.c”,“a.c.d”,“a.b.d”])
)
);
//甚至:
常数compose=(f,g)=>x=>f(g(x));

const items_to_format=组合(树到树,项到树)太棒了,谢谢你的帮助。我想我已经理解了这里使用的概念。