Javascript 使用 object.create() 从字符串构建树
Javascript build a tree from a string with object.create()
我想从一个字符串创建一个服务树,它是人的属性。
我设法做到了,但是代码很丑陋,这对我来说是练习之王,因为我想用 "class" 个对象使用 "Object.create()" 来实现它,其中 class 看起来像这样:
let service = {
serviceFather: "",
serviceChildren: [],
people: [],
}
};
输入样本是:
[
{
"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"
}
]
预期输出为:
[
{
"name": "EE",
"serviceFather": "root",
"people": [
{
"name": "John Doe"
}],
"serviceChildren": [
{
"name": "EA",
"serviceFather": "EE",
"people": [
{
"name": "Jane Doe"
}],
"serviceChildren": [
{
"name": "EB",
"serviceFather": "EA",
"people": [
{
"name": "Jack Smith"
}],
"sousService": ""
},
{
"name": "EC",
"serviceFather": "EA",
"people": [
{
"name": "Jill Smith"
},
{
"name": "Jake Smith"
}],
"sousService": ""
}]
}]
}]
您可以在服务 属性 上使用 split
,然后 forEach
循环和 reduce
迭代嵌套树并添加到数组。
const 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" }
]
let service = {
serviceFather: "",
serviceChildren: [],
people: [],
};
function create(data) {
const res = []
data.forEach(obj => {
obj.service.split('.').reduce((r, e, i, a) => {
const match = r.find(({ name }) => name == e);
if(!match) {
const o = Object.create(service);
o.name = e;
o.serviceFather = (i == 0 ? 'root' : a[i - 1])
o.people = [{ name: obj.name }]
o.serviceChildren = [];
r.push(o)
return r;
} else {
if(!a[i + 1]) match.people.push({ name: obj.name })
return match.serviceChildren
}
}, res)
})
return res;
}
const result = create(data)
console.log(result)
您可以采用虚拟对象并迭代服务级别。
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, a) => {
var temp = (o.serviceChildren = o.serviceChildren || []).find(({ name }) => name === k);
if (!temp) {
o.serviceChildren.push(temp = {
name: k,
serviceFather: a[i - 1] || 'root',
people: []
});
}
return temp;
}, { serviceChildren: result })
.people.push({ name });
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
我想从一个字符串创建一个服务树,它是人的属性。 我设法做到了,但是代码很丑陋,这对我来说是练习之王,因为我想用 "class" 个对象使用 "Object.create()" 来实现它,其中 class 看起来像这样:
let service = {
serviceFather: "",
serviceChildren: [],
people: [],
}
};
输入样本是:
[
{
"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"
}
]
预期输出为:
[
{
"name": "EE",
"serviceFather": "root",
"people": [
{
"name": "John Doe"
}],
"serviceChildren": [
{
"name": "EA",
"serviceFather": "EE",
"people": [
{
"name": "Jane Doe"
}],
"serviceChildren": [
{
"name": "EB",
"serviceFather": "EA",
"people": [
{
"name": "Jack Smith"
}],
"sousService": ""
},
{
"name": "EC",
"serviceFather": "EA",
"people": [
{
"name": "Jill Smith"
},
{
"name": "Jake Smith"
}],
"sousService": ""
}]
}]
}]
您可以在服务 属性 上使用 split
,然后 forEach
循环和 reduce
迭代嵌套树并添加到数组。
const 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" }
]
let service = {
serviceFather: "",
serviceChildren: [],
people: [],
};
function create(data) {
const res = []
data.forEach(obj => {
obj.service.split('.').reduce((r, e, i, a) => {
const match = r.find(({ name }) => name == e);
if(!match) {
const o = Object.create(service);
o.name = e;
o.serviceFather = (i == 0 ? 'root' : a[i - 1])
o.people = [{ name: obj.name }]
o.serviceChildren = [];
r.push(o)
return r;
} else {
if(!a[i + 1]) match.people.push({ name: obj.name })
return match.serviceChildren
}
}, res)
})
return res;
}
const result = create(data)
console.log(result)
您可以采用虚拟对象并迭代服务级别。
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, a) => {
var temp = (o.serviceChildren = o.serviceChildren || []).find(({ name }) => name === k);
if (!temp) {
o.serviceChildren.push(temp = {
name: k,
serviceFather: a[i - 1] || 'root',
people: []
});
}
return temp;
}, { serviceChildren: result })
.people.push({ name });
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }