从数组创建对象树 [英] Create an tree of objects from arrays
本文介绍了从数组创建对象树的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想用数组制作一棵对象树。
这里提供了一个很好的解决方案(我发现减少方法的地方): Javascript使用object.create()从字符串中构建一棵树
实际上,我的需求有所不同,而且我无法修改提供的代码...所以我回到这里得到帮助!!!
(谢谢)。
我将在此帖子的末尾张贴完整的初始代码
i'd like to make a tree of objects from arrays. A nice solution has been provided to me (where i've discovered "reduce" method) here : Javascript build a tree from a string with object.create() Actually, my need is a bit different, and i don't manage to adapt the provided code... so I come back here to be helped !!! (thank you). I'll post the full initial code at the end of this post
input:
[
{
"name": "John Doe",
"service": "EE",
},
{
"name": "Jane Doe",
"service": "EE.EA",
},
{
"name": "Jack Smith",
"service": "EE.EA.EB",
},
{
"name": "Jill Smith",
"service": "EE.EA.EC"
},
{
"name": "Jake Smith",
"serviceLevel": "EE.EA.EC"
}
]
输出:
{
"EE":
{
"serviceFather": "root",
"people": [
{
"name": "John Doe"
}],
"serviceChildren":
{
"EA":
{
"serviceFather": "EE",
"people": [
{
"name": "Jane Doe"
}],
"serviceChildren":
{
"EB":
{
"serviceFather": "EA",
"people": [
{
"name": "Jack Smith"
}],
"serviceChildren":
{}
},
"EC":
{
"serviceFather": "EA",
"people": [
{
"name": "Jill Smith"
},
{
"name": "Jake Smith"
}],
"serviceChildren":
{}
}
}
}
}
}
}
初始代码:
function format(data) {
const res = []
data.forEach(obj => {
obj.serviceTree.split('.').reduce((r, e, i, a) => {
console.log(r, e, i, a);
const oParent = r.find(({ name }) => name == a[i - 1]);
const match = r.find(({ name }) => name == e);
if (!match) {
const o = Object.create(service);
o.name = e;
if (!a[i + 1]) {
o.serviceName = obj.serviceName;
o.serviceTree = obj.serviceTree;
o.serviceLevel = i;
o.serviceParent = (i == 0 ? 'root' : a[i - 1]);
o.people = [{
familyName: obj.familyName,
firstName: obj.firstName,
jobTitle: obj.jobTitle,
rank: obj.rank,
phone: obj.phone,
mobile: obj.mobile,
mail: obj.mail
}];
if (oParent) {
oParent.serviceChildren.push(o);
} else {
o.serviceChildren = [];
r.push(o);
}
} else {
let treeStamp = a.slice();
treeStamp.pop();
o.serviceName = e;
o.serviceTree = treeStamp.join('.');
o.serviceLevel = i;
o.serviceParent = (i == 0 ? 'root' : a[i - 1]);
o.serviceChildren = [];
r.push(o);
}
return r;
} else {
if (!a[i + 1]) match.people.push({
familyName: obj.familyName,
firstName: obj.firstName,
jobTitle: obj.jobTitle,
rank: obj.rank,
phone: obj.phone,
mobile: obj.mobile,
mail: obj.mail
});
return match.serviceChildren;
}
}, res);
});
return res;
}
推荐答案
您可以参加拆分服务,并以此作为访问嵌套对象的键。
You could take the part of splitted service and take this as key for accessing the nested objects.
var data = [{ name: "John Doe", service: "EE" }, { name: "Jane Doe", service: "EE.EA" }, { name: "Jack Smith", service: "EE.EA.EB" }, { name: "Jill Smith", service: "EE.EA.EC" }, { name: "Jake Smith", service: "EE.EA.EC" }],
result = {};
data.forEach(({ name, service }) => {
service
.split('.')
.reduce((o, k, i, { [i - 1]: serviceFather = 'root' }) => {
o.serviceChildren = o.serviceChildren || {};
o.serviceChildren[k] = o.serviceChildren[k] || { serviceFather, people: [] };
return o.serviceChildren[k];
}, { serviceChildren: result })
.people.push({ name });
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
这篇关于从数组创建对象树的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文