2017-04-25 56 views
0
[ 
    { 
    "children": [ 
     { 
     "children": [ 
      { 
      "dateAdded": 1493033302670, 
      "id": "1534", 
      "index": 0, 
      "parentId": "1", 
      "title": "data1", 
      "url": "data2" 
      }, 
      { 
      "children": [ 
       { 
       "dateAdded": 1489571506844, 
       "id": "1451", 
       "index": 0, 
       "parentId": "1401", 
       "title": "data3", 
       "url": "data4" 
       } 
      ], 
      "dateAdded": 1490363326576, 
      "dateGroupModified": 1490363326576, 
      "id": "1401", 
      "index": 1, 
      "parentId": "1", 
      "title": "daily" 
      }, 
      { 
      "children": [ 
       { 
       "dateAdded": 1481787664555, 
       "id": "1429", 
       "index": 0, 
       "parentId": "1407", 
       "title": "data56", 
       "url": "data" 
       }, 
       { 
       "dateAdded": 1483365608504, 
       "id": "1430", 
       "index": 1, 
       "parentId": "1407", 
       "title": "data34", 
       "url": "data55" 
       } 
      ] 
      } 
     ] 
     } 
    ] 
    } 
] 

これはChromeのブックマークデータを表しています。入れ子にされたjsonオブジェクトを平滑化する

オブジェクトにurlがある場合、それはブックマークであることを意味します。 urlプロパティがない場合はフォルダです。

木構造です。

タイプのという追加のプロパティを持つflattenオブジェクトを作成したいと思います。 Like:

[ 
{ 
    "dateAdded": 1489571506844, 
    "id": "1451", 
    "index": 0, 
    "parentId": "1401", 
    "title": "title", 
    "url": "some url", 
    "type": "bookmark" 

}, 
{ 
    "dateAdded": 1489571506844, 
    "id": "1451", 
    "index": 0, 
    "parentId": "1402", 
    "title": "title2", 
    "url": "some url2" 
    "type": "folder" 
} 
] 

ありがとうございます。

答えて

1

あなたがフラットなデータを取得するための反復と再帰的なアプローチを使用することができます。

function flatten(array) { 
 
    var result = []; 
 
    array.forEach(function iter(o) { 
 
     var temp = {}, 
 
      keys = Object.keys(o); 
 

 
     if (keys.length > 1) { 
 
      keys.forEach(function (k) { 
 
       if (k !== 'children') { 
 
        temp[k] = o[k]; 
 
       } 
 
      }); 
 
      temp.type = 'url' in o ? 'bookmark' : 'folder'; 
 
      result.push(temp); 
 
     } 
 
     Array.isArray(o.children) && o.children.forEach(iter); 
 
    }); 
 
    return result; 
 
} 
 

 
var data = [{ children: [{ children: [{ dateAdded: 1493033302670, id: "1534", index: 0, parentId: "1", title: "data1", url: "data2" }, { children: [{ dateAdded: 1489571506844, id: "1451", index: 0, parentId: "1401", title: "data3", url: "data4" }], dateAdded: 1490363326576, dateGroupModified: 1490363326576, id: "1401", index: 1, parentId: "1", title: "daily" }, { children: [{ dateAdded: 1481787664555, id: "1429", index: 0, parentId: "1407", title: "data56", url: "data" }, { dateAdded: 1483365608504, id: "1430", index: 1, parentId: "1407", title: "data34", url: "data55" }] }] }] }]; 
 

 
console.log(flatten(data));
.as-console-wrapper { max-height: 100% !important; top: 0; }

2

オブジェクトを含む配列を反復処理する関数を作成しました。指定されたオブジェクトにchildrenというプロパティがある場合、この関数は自身を呼び出します。そうでなければ、新しい配列flattenedBookmarksにプッシュされます。

おそらく、新しいグローバル配列flattenedBookmarksに格納するのではなく、関数から平坦化配列を返すべきであるが、少なくとも、これはあなたが始められるでしょう

var flattenedBookmarks = []; 

flattenBookmarks(bookmarks); 

function flattenBookmarks(bookmarks) { 
    for (var i = 0; i < bookmarks.length; i++) { 
     var potentialBookmark = bookmarks[i]; 

     if (potentialBookmark.hasOwnProperty("url")) { 
      potentialBookmark.type = "bookmark"; 
     } else { 
      potentialBookmark.type = "folder"; 
     } 

     if (potentialBookmark.hasOwnProperty("children")) { 
      flattenBookmarks(potentialBookmark.children); 

      if (potentialBookmark.hasOwnProperty("dateGroupModified")) { 
       flattenedBookmarks.push(potentialBookmark); 
      } 
     } else { 
      flattenedBookmarks.push(potentialBookmark); 
     } 
    } 
} 

ソリューション。

https://jsfiddle.net/s9ur35re/

1

の例では、コードを説明するだけではなく、ここでそれを入れてくださいすることができ、それを

data = [ 
 
    { 
 
    "children": [ 
 
     { 
 
     "children": [ 
 
      { 
 
      "dateAdded": 1493033302670, 
 
      "id": "1534", 
 
      "index": 0, 
 
      "parentId": "1", 
 
      "title": "data1", 
 
      "url": "data2" 
 
      }, 
 
      { 
 
      "children": [ 
 
       { 
 
       "dateAdded": 1489571506844, 
 
       "id": "1451", 
 
       "index": 0, 
 
       "parentId": "1401", 
 
       "title": "data3", 
 
       "url": "data4" 
 
       } 
 
      ], 
 
      "dateAdded": 1490363326576, 
 
      "dateGroupModified": 1490363326576, 
 
      "id": "1401", 
 
      "index": 1, 
 
      "parentId": "1", 
 
      "title": "daily" 
 
      }, 
 
      { 
 
      "children": [ 
 
       { 
 
       "dateAdded": 1481787664555, 
 
       "id": "1429", 
 
       "index": 0, 
 
       "parentId": "1407", 
 
       "title": "data56", 
 
       "url": "data" 
 
       }, 
 
       { 
 
       "dateAdded": 1483365608504, 
 
       "id": "1430", 
 
       "index": 1, 
 
       "parentId": "1407", 
 
       "title": "data34", 
 
       "url": "data55" 
 
       } 
 
      ] 
 
      } 
 
     ] 
 
     } 
 
    ] 
 
    } 
 
]; 
 
data2 = []; 
 
function search(data) { 
 
for (n in data) { 
 
    if (typeof data[n] == 'object') { 
 
    if (data[n].id != undefined) { 
 
    if (data[n].url != undefined) { 
 
    data[n].type="folder"; 
 
    } else { 
 
    data[n].type="bookmark"; 
 
    } 
 
    data2.push(data[n]); 
 
    } 
 
    search(data[n]); 
 
    } 
 
} 
 
} 
 
search(data); 
 
console.log(data2);

+0

を行う方法を示しています – kaldoran

関連する問題