2017-09-23 7 views
-1

Ce JSON est la représentation des signets « Chrome:objet JSON Parse algorithme

enter image description here

{ 
    "checksum": "c3f0feee53f25f2382bc3eff47034d82", 
    "roots": { 
     "bookmark_bar": { 
     "children": [ { 
      "children": [ { 
       "children": [ { 
        "date_added": "13150632079496078", 
        "id": "10", 
        "name": "js page", 
        "type": "url", 
        "url": "http://page3.com/" 
       } ], 
       "date_added": "13150631991440413", 
       "date_modified": "13150632092493717", 
       "id": "7", 
       "name": "js", 
       "type": "folder" 
      }, { 
       "date_added": "13150632069464091", 
       "id": "9", 
       "name": "language page", 
       "type": "url", 
       "url": "http://page2.com/" 
      } ], 
      "date_added": "13150631979905599", 
      "date_modified": "13150632079496078", 
      "id": "6", 
      "name": "language", 
      "type": "folder" 
     }, { 
      "date_added": "13150632058452033", 
      "id": "8", 
      "name": "page 1", 
      "type": "url", 
      "url": "http://page1.com/" 
     }, { 
      "children": [ { 
       "date_added": "13150632233410110", 
       "id": "12", 
       "name": "linux", 
       "type": "url", 
       "url": "http://linux.com/" 
      }, { 
       "date_added": "13150632242559984", 
       "id": "13", 
       "name": "windows", 
       "type": "url", 
       "url": "http://windows.com/" 
      } ], 
      "date_added": "13150632129199190", 
      "date_modified": "13150632242559984", 
      "id": "11", 
      "name": "os", 
      "type": "folder" 
     } ], 
     "date_added": "13150631968031471", 
     "date_modified": "13150632129201358", 
     "id": "1", 
     "name": "Bookmarks Bar", 
     "type": "folder" 
     }, 
     "other": { 
     "children": [ { 
      "children": [ { 
       "date_added": "13150632296451689", 
       "id": "15", 
       "name": "another url", 
       "type": "url", 
       "url": "http://anotherurl.com/" 
      } ], 
      "date_added": "13150632284982823", 
      "date_modified": "13150632296451689", 
      "id": "14", 
      "name": "another folder", 
      "type": "folder" 
     } ], 
     "date_added": "13150631968031475", 
     "date_modified": "13150632284984136", 
     "id": "2", 
     "name": "Other Bookmarks", 
     "type": "folder" 
     }, 
     "synced": { 
     "children": [ ], 
     "date_added": "13150631968031476", 
     "date_modified": "0", 
     "id": "3", 
     "name": "Mobile Bookmarks", 
     "type": "folder" 
     } 
    }, 
    "version": 1 
} 

je voudrais aplatir tout JSON et ajouter chaque nom de dossier parent au signet correspondant comme balise (peut-être aux tags: [] propriété de chaque marque-page).

Par exemple: comme on le voit dans l'image, le signet "page de la langue" devrait être:

 [{ 
     ... 
     }, 
     { 
      "date_added": "13150632069464091", 
      "id": "9", 
      "name": "language page", 
      "type": "url", 
      "url": "http://page2.com/", 
      tags: ["Bookmarks Bar","language"] 
     }, 
     { 
     ... 
     }] 

Si cela aiderait, voici ce que j'utilise pour aplatir le JSON:

if (dataJson.roots) { 
     // build the bookmarks list 
     let bookmarks = []; 
     let keys = Object.keys(dataJson.roots); 
     for (let i = 0; i < keys.length; i++) { 
      const folder = keys[i]; 
      const rootObject = dataJson.roots[folder]; 
      // retrieve child nodes in each root folder 
      // and concatenate to global collection 
      const children = rootObject.children ? getChildren(rootObject.children) : []; 
      if (children.length) { 
       for (let j = 0; j < children.length; j++) { 
        bookmarks.push(children[j]); 
       } 
      } 
     } 
     const nb = new Array(bookmarks.length); 
     for (let i = 0; i < bookmarks.length; i++) { 
      nb[i] = normalize(bookmarks[i]); 
     } 
     resolve(nb); 
    } else { 
     resolve([]); 
    } 

Note: La solution pourrait bien sûr être plus claire une autre boucle. Merci!

Répondre

1

peut utiliser un apporach récursive pour aller en profondeur dans l'arbre, et ajouter des balises à ce:

function flatten(obj){ 
    const result = []; 
    //as this is applied to a folder, iterate over all children: 
    for(const child of obj.children){ 
     //if child is a folder 
     if(child.children){ 
     //concat all flattened results 
     result.push(... flatten(child)); 
     } else { 
     //just a regular child 
     result.push(child); 
     } 
    } 
    //add tag to each result: 
    result.forEach(o => (o.tags || (o.tags = [])).unshift(obj.name)); 
    return result; 
    } 

Alors maintenant, nous pouvons aplatir un arbre, par exemple:

const result = flatten(yourJSON.roots.other); 

donc nous avons juste besoin pour l'appliquer à toutes les racines et maintenant concaténer les résultats:

const result = Object.values(yourJSON.roots) 
       .map(flatten) 
       .reduce((a,b) => a.concat(b), []); 

Try it

+0

Merci beaucoup, c'est beaucoup plus propre. – serkan