Estoy creando una aplicación para tomar notas y he decidido almacenar todas las notas y la estructura en un archivo JSON. En javascript, obtengo el JSON con AJAX, lo analizo y lo envío al sitio web.
La estructura de mi nota es una matriz de objetos que se pueden anidar, como esta (si es una nota, tiene un atributo de "contenido", si es una carpeta, tiene una matriz de objetos (también puede ser una matriz vacía si la carpeta debería vaciar):
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: "....." } ] } ] } ] }Para enumerar el directorio raíz, es simple, simplemente recorro la matriz, ya que solo genera los registros de nivel superior:
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); }Pero, ¿y las carpetas? ¿Cómo debo proceder para enumerar las carpetas si se desconoce la profundidad de anidamiento? ¿Y cómo me dirijo a la carpeta específica? ¿Debo agregar ID únicos a cada objeto para poder filtrar la matriz con ellos? ¿O debería almacenar algún tipo de información de profundidad en una variable todo el tiempo?
Está haciendo esto más difícil para usted al guardar datos en un archivo JSON. Ese no es un buen enfoque. Lo que debe hacer es diseñar un esquema de base de datos apropiado para sus datos y crear una API que genere un patrón predecible de datos con los que su cliente pueda trabajar.
Sugeriría tener un recurso de Folder y un recurso de Note vinculados a través de una relación de uno a muchos. Cada recurso de Folder puede tener muchas entradas de Note asociadas, pero cada Note tiene solo una Folder a la que está vinculada. Sugiero usar un ORM, porque la mayoría facilita la carga de datos relacionados. Por ejemplo, si elige Laravel, puede usar Eloquent y luego obtener todas las notas para una carpeta es tan fácil como:
$folderWithNotes = Folder::with('notes')->where('name', 'school-notes')->get();Saber PHP no viene al caso. Todavía deberías poder ver la lógica de eso.
Si crea una base de datos y crea una API del lado del servidor para manejar sus datos, terminará con JSON en el lado del cliente que tiene un formato predecible y es fácil trabajar con él.