Search code examples
javascriptjsonnestedflat

flattening nested json object


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

This is a representation of Chrome bookmarks data.

If the object has url property it means that is a bookmark. If it does not have url property it is a folder.

It is a tree structure.

I would like to create flatten object with additional property named type. 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"
}
] 

Thanks in advance.


Solution

  • You could use an iterative and recursive approach for getting flat data.

    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; }