如何导航未知深度的嵌套对象?



我正在制作一个笔记应用程序,我决定将所有的笔记和结构存储在JSON文件中。在javascript上,我用AJAX得到JSON,解析它并输出到网站上。

我的笔记结构是一个可以嵌套的对象数组,就像这样(如果它是一个笔记,它有一个"content"属性,如果它是一个文件夹,它有一个对象数组(如果文件夹应该是空的,也可以是空数组):

data {
entries = [
{
name: "Some note",
content: "This is a test note"
},
{
name: "folder",
children: [
{
name: "Bread recpie",
content: "Mix flour with water..."
},
{
name: "Soups",
children: [
{
name: "Pork soup",
content: "Add meat, onion..."
},
{
name: "Chicken soup"
content: "....."
}
] 
}
]
}
]
}

要列出根目录,很简单,我只是循环遍历数组,因为它只输出顶级记录:

for (entry of data.entries) {
const li = document.createElement("li");
li.textContent = entry.name;
if (entry.children) {
li.className = "folder";
} else {
li.className = "file";
}
loop.appendChild(li); 
} 

但是文件夹呢?如果嵌套深度未知,我应该如何列出文件夹?我如何针对特定的文件夹?我应该为每个对象添加唯一的id,以便我可以用它们过滤数组吗?还是应该一直在变量中存储某种深度信息?

您将数据保存到JSON文件中,这会使您自己更加困难。这不是一个好的方法。您需要做的是为您的数据设计一个适合的数据库模式,并创建一个API,该API输出客户端可以使用的可预测的数据模式。

我建议通过一对多关系链接Folder资源和Note资源。每个Folder资源可以有许多关联的Note条目,但是每个Note只有一个与之链接的Folder。我建议使用ORM,因为大多数ORM都很容易快速加载相关数据。例如,如果你选择Laravel,你可以使用Eloquent,然后获取一个文件夹的所有笔记就像:

$folderWithNotes = Folder::with('notes')->where('name', 'school-notes')->get();

了解PHP是无关紧要的。您应该仍然能够看到其中的逻辑。

如果你创建了一个数据库,并构建了一个服务器端API来处理你的数据,你最终会在客户端得到JSON,它具有可预测的格式,并且易于使用。

最新更新