2017-04-25 1 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 속성이 없으면 폴더입니다.

나무 구조입니다.

이라는 추가 속성이있는 병합 된 개체를 만들고 싶습니다. 좋아요 :

[ 
{ 
    "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