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);
我有一个字符串输入示例,格式为 - "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);