为了更易理解问题,将其分解成若干部分。
第一步是将每个字符串转换为可用的内容,将以下内容进行转换:
"animal/mammal/dog"
转化为:
[ "animal", "mammal", "dog" ]
这是一个用于构建最终对象所需的属性名称数组。
两个函数可以为您完成此操作,String.prototype.split()
用于将字符串拆分成数组,Array.prototype.map()
用于转换数组中的每个元素:
let splitIntoNames = input.map(str => str.split('/'));
中间结果如下:
[
[ "animal", "mammal", "dog" ],
[ "animal", "mammal", "cat", "tiger" ],
[ "animal", "mammal", "cat", "lion" ],
[ "animal", "mammal", "elephant" ],
[ "animal", "reptile" ],
[ "plant", "sunflower" ]
]
下一步是迭代每个数组,使用
Array.prototype.forEach()
为对象添加属性。你可以使用for循环向对象添加属性,但让我们使用递归函数
addName()
来完成这个任务:
function addName(element, list, index) {
if (index >= list.length) {
return;
}
let name = list[index];
let isEndOfList = index === list.length - 1;
element[name] = element[name] || (isEndOfList ? true : {});
addName(element[name], list, index + 1);
}
let result = {};
splitIntoNames.forEach((list) => {
addName(result, list, 0);
});
结果如下:
result: {
"animal": {
"mammal": {
"dog": true,
"cat": {
"tiger": true,
"lion": true
},
"elephant": true
},
"reptile": true
},
"plant": {
"sunflower": true
}
}
const input = [
"animal/mammal/dog",
"animal/mammal/cat/tiger",
"animal/mammal/cat/lion",
"animal/mammal/elephant",
"animal/reptile",
"plant/sunflower",
];
let splitIntoNames = input.map((str) => str.split("/"));
console.log("splitIntoNames:", JSON.stringify(splitIntoNames, null, 2));
function addName(element, list, index) {
if (index >= list.length) {
return;
}
let name = list[index];
let isEndOfList = index === list.length - 1;
element[name] = element[name] || (isEndOfList ? true : {});
addName(element[name], list, index + 1);
}
let result = {};
splitIntoNames.forEach((list) => {
addName(result, list, 0);
});
console.log("result:", JSON.stringify(result, null, 2));