javascript - 将名称之间带点的数组映射到嵌套字段
问题描述
我正在尝试转换名称之间带有点的字符串数组。我想制作一个像 in 一样的对象数组const out
。我试图通过reduceRight来实现,但我不知道如何组合字段。
我的代码:
const input = ['apples', 'bananas.kivi.grape', 'bananas.orange', 'bananas.strawberry'];
const res = input.map((item) => {
const splInp = item.split('.');
return splInp.reduceRight((acc, item) => {
if (Object.keys(acc).length !== 0) {
return {
children: [acc],
"name": item
};
} else {
return {
"name": item
};
}
}, []/* as any*/);
});
console.log(res);
期望的输出:
const out = [
{ name: 'apples' },
{
name: 'bananas',
children: [
{
name: 'kivi',
children: [
{
name: 'grape',
},
],
},
{ name: 'orange' },
{ name: 'strawberry' },
],
},
];
解决方案
您可以使用trie解决它
每当你得到一个字符串时,只需遍历你的树并最终添加任何叶子(如果你不能遍历更多)
const input = ['apples', 'bananas.kivi.grape', 'bananas.orange', 'bananas.strawberry', 'apples.are.good', 'apples.are.not.good'];
const Trie = () => {
const root = {}
const add = s => {
s.split('.').reduce((acc, tok) => {
if (!acc[tok]) {
// add the leaf
acc[tok] = { children: {} }
}
// traverse the node
return acc[tok].children
}, root)
}
const toJSON = (node = root) => {
return Object.entries(node).map(([name, { children }]) => ({
name, children: toJSON(children)
}))
}
return { add, toJSON }
}
const t = Trie()
input.forEach(t.add)
console.log(JSON.stringify(t.toJSON(), null, 2))
推荐阅读
- ios - 从 swift 4.0 webview 中删除上下文菜单
- python - 如何在两个 python 程序中共享 OpenCV 图像?
- javascript - 为什么隐藏所有输入无法返回到 Jupyter 笔记本中的完整代码单元?
- javascript - Azure 函数计时器在数据库表的确切时间触发
- python - 想在按下“e”后退出while循环,但循环认为“e”是输入并给我一个错误
- python-3.x - LeakyReLU 对象是可调用的吗?
- android - 如何将pdf文件发送到android studio中的服务器
- python - Pycharm 中带有 pytest 运行/调试日志的 ##teamcity[... 消息在哪里?
- c# - 将 UWP 应用置于当前窗口的前面
- excel - 从 Excel VBA 访问共享 Outlook 收件箱