gpt4 book ai didi

javascript - 尾递归 JSON 构造函数

转载 作者:搜寻专家 更新时间:2023-10-31 23:45:10 25 4
gpt4 key购买 nike

我有一个来自 NPM 包 'directory-tree 的目录结构' 我想将其展平为一个更简单的嵌套结构。我想要一个尾递归解决方案来将第一个对象转换为第二个对象,但我无法思考如何构造它。

当然,首要条件是第一个结构中的“Node ”是"file"还是“目录”。如果它是一个文件,我们只需要文件的基本名称来键入相对路径。但是,如果它是一个目录,我们希望目录的基本名称成为对象的键并从那里递归。

我将使用他们的示例来说明结构:

{
"path": "photos",
"name": "photos",
"size": 600,
"type": "directory",
"children": [
{
"path": "photos/summer",
"name": "summer",
"size": 400,
"type": "directory",
"children": [
{
"path": "photos/summer/june",
"name": "june",
"size": 400,
"type": "directory",
"children": [
{
"path": "photos/summer/june/windsurf.jpg",
"name": "windsurf.jpg",
"size": 400,
"type": "file",
"extension": ".jpg"
}
]
}
]
},
{
"path": "photos/winter",
"name": "winter",
"size": 200,
"type": "directory",
"children": [
{
"path": "photos/winter/january",
"name": "january",
"size": 200,
"type": "directory",
"children": [
{
"path": "photos/winter/january/ski.png",
"name": "ski.png",
"size": 100,
"type": "file",
"extension": ".png"
},
{
"path": "photos/winter/january/snowboard.jpg",
"name": "snowboard.jpg",
"size": 100,
"type": "file",
"extension": ".jpg"
}
]
}
]
}
]
}

我希望最终结构更简单。类似于以下内容:

{
"photos": {
"summer": {
"june": {
"windsurf.jpg": "photos/summer/june/windsurf.jpg"
}
},
"winter": {
"january": {
"ski.png": "photos/winter/january/ski.png",
"snowboard.jpg": "photos/winter/january/snowboard.jpg"
}
}
}
}

最佳答案

我们可以根据您的情况将深度优先搜索转换为尾递归。

let testObj = {
"path": "photos",
"name": "photos",
"size": 600,
"type": "directory",
"children": [
{
"path": "photos/summer",
"name": "summer",
"size": 400,
"type": "directory",
"children": [
{
"path": "photos/summer/june",
"name": "june",
"size": 400,
"type": "directory",
"children": [
{
"path": "photos/summer/june/windsurf.jpg",
"name": "windsurf.jpg",
"size": 400,
"type": "file",
"extension": ".jpg"
}
]
}
]
},
{
"path": "photos/winter",
"name": "winter",
"size": 200,
"type": "directory",
"children": [
{
"path": "photos/winter/january",
"name": "january",
"size": 200,
"type": "directory",
"children": [
{
"path": "photos/winter/january/ski.png",
"name": "ski.png",
"size": 100,
"type": "file",
"extension": ".png"
},
{
"path": "photos/winter/january/snowboard.jpg",
"name": "snowboard.jpg",
"size": 100,
"type": "file",
"extension": ".jpg"
}
]
}
]
}
]
};

function tailRecurse(stack, result){
if (!stack.length)
return result;

// stack will contain
// the next object to examine
[obj, ref] = stack.pop();

if (obj.type == 'file'){
ref[obj.name] = obj.path;

} else if (obj.type == 'directory'){
ref[obj.name] = {};

for (let child of obj.children)
stack.push([child, ref[obj.name]]);
}

return tailRecurse(stack, result);
}


// Initialise
let _result = {};
let _stack = [[testObj, _result]];

console.log(tailRecurse(_stack, _result));

关于javascript - 尾递归 JSON 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48266446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com