字符串数组到树数据结构?
array of strings to tree data structure?
有数据从服务器 return 编辑,包含一个字符串数组作为层次结构,如下所示:
var array = [
"house.bedroom.bed",
"house.kitchen.spoon",
"house.kitchen.knife",
"house.bedroom.sofa",
"house.bedroom.tv",
"plants.trees",
"house.birds.parrot.grey"
]
我已经成功地制作了一个树状数据结构作为对象,以下面的树形式输出数据:
house
bedroom
bed
sofa
tv
kitchen
spoon
knife
birds
parrot
grey
plants
trees
有什么方法可以选择字符串吗?例如被问到的“厨房”,我想 return 所有与该字符串相关的内容,如下所示:
house.kitchen.knife
house.kitchen.spoon
这是我学到的代码:
function find([key, values], string, temp = []) {
var result;
temp = temp.concat(key);
if (key === string) {
return temp.slice(1).join('.');
}
values.some(a => result = find(a, string, temp));
return result;
}
var result = array.reduce((r, s) => {
('root.' + s).split('.').reduce((a, item) => {
var array = a.find(([v]) => v === item);
if (!array) {
a.push(array = [item, []]);
}
return array[1];
}, r);
return r;
}, []).pop();
console.log(find(result, 'kitchen'));
console.log(result);
我的输出是:
house.kitchen
我相信我明白你在问什么。我会用递归来解决这个问题。
function parse(items) {
return items.reduce((acc, item) => {
const k = item.slice(0, item.indexOf('.'))
const v = item.slice(item.indexOf('.') + 1).split('.')
const newItem = {
[k]: v.length > 1 ? parse(v) : v
}
return Object.assign(acc, newItem)
}, { })
}
这不是一个完整的解决方案,但应该可以理解总体思路。对于数组中的每个项目,将其拆分为一个键和一个值。键将是第一个 .
之前的字符串,而值为 .
之后的单个字符串或包含子对象的对象。
我建议过滤原数组
const data = ["house.bedroom.bed","house.kitchen.spoon", "house.kitchen.knife","house.bedroom.sofa","house.bedroom.tv",
"plants.trees","house.birds.parrot.grey"];
const result = data.filter((path) => path.split('.').includes('kitchen'));
console.log(result);
.as-console-wrapper{min-height: 100%!important; top: 0}
有数据从服务器 return 编辑,包含一个字符串数组作为层次结构,如下所示:
var array = [
"house.bedroom.bed",
"house.kitchen.spoon",
"house.kitchen.knife",
"house.bedroom.sofa",
"house.bedroom.tv",
"plants.trees",
"house.birds.parrot.grey"
]
我已经成功地制作了一个树状数据结构作为对象,以下面的树形式输出数据:
house
bedroom
bed
sofa
tv
kitchen
spoon
knife
birds
parrot
grey
plants
trees
有什么方法可以选择字符串吗?例如被问到的“厨房”,我想 return 所有与该字符串相关的内容,如下所示:
house.kitchen.knife
house.kitchen.spoon
这是我学到的代码:
function find([key, values], string, temp = []) {
var result;
temp = temp.concat(key);
if (key === string) {
return temp.slice(1).join('.');
}
values.some(a => result = find(a, string, temp));
return result;
}
var result = array.reduce((r, s) => {
('root.' + s).split('.').reduce((a, item) => {
var array = a.find(([v]) => v === item);
if (!array) {
a.push(array = [item, []]);
}
return array[1];
}, r);
return r;
}, []).pop();
console.log(find(result, 'kitchen'));
console.log(result);
我的输出是:
house.kitchen
我相信我明白你在问什么。我会用递归来解决这个问题。
function parse(items) {
return items.reduce((acc, item) => {
const k = item.slice(0, item.indexOf('.'))
const v = item.slice(item.indexOf('.') + 1).split('.')
const newItem = {
[k]: v.length > 1 ? parse(v) : v
}
return Object.assign(acc, newItem)
}, { })
}
这不是一个完整的解决方案,但应该可以理解总体思路。对于数组中的每个项目,将其拆分为一个键和一个值。键将是第一个 .
之前的字符串,而值为 .
之后的单个字符串或包含子对象的对象。
我建议过滤原数组
const data = ["house.bedroom.bed","house.kitchen.spoon", "house.kitchen.knife","house.bedroom.sofa","house.bedroom.tv",
"plants.trees","house.birds.parrot.grey"];
const result = data.filter((path) => path.split('.').includes('kitchen'));
console.log(result);
.as-console-wrapper{min-height: 100%!important; top: 0}