2016-07-21 9 views
4

I diese Datenstruktur haben, die die Tiefe von jedem Knoten in dem Baum nested zeigen:JSON Erstellen von Nested Sets JavaScript

[ 
    { 
    "name": "ELECTRONICS", 
    "depth": 0 
    }, 
    { 
    "name": "TELEVISIONS", 
    "depth": 1 
    }, 
    { 
    "name": "TUBE", 
    "depth": 2 
    }, 
    { 
    "name": "PLASMA", 
    "depth": 2 
    }, 
    { 
    "name": "GAME CONSOLES", 
    "depth": 1 
    }, 
    { 
    "name": "MP3 PLAYERS", 
    "depth": 1 
    }, 
    { 
    "name": "FLASH", 
    "depth": 2 
    }] 

Ich möchte die Vorschaudaten mit JavaScript/node.js/Schräg zu transformieren in eine hierarchische JSON wie folgt aus:

[{ 
    "name": "ELECTRONICS", 
    "children": [ 
     { 
     "name": "TELEVISIONS", 
     "children": [ 
      { 
      "name": "TUBE" 
      }, 
      { 
      "name": "PLASMA" 
      }] 
    }, 
    { 
     "name": "GAME CONSOLES" 
    }, 
    { 
     "name": "MP3 PLAYERS", 
     "children": [ 
      { 
      "name": "FLASH" 
     }] 
    }] 
}] 
+0

Die Tiefe helfen zu verstehen, ist – Danilo

Antwort

4

Sie könnten Array#forEach und ein Array für den Hinweis auf die Tiefe verwenden.

var data = [{ "name": "ELECTRONICS", "depth": 0 }, { "name": "TELEVISIONS", "depth": 1 }, { "name": "TUBE", "depth": 2 }, { "name": "PLASMA", "depth": 2 }, { "name": "GAME CONSOLES", "depth": 1 }, { "name": "MP3 PLAYERS", "depth": 1 }, { "name": "FLASH", "depth": 2 }], 
 
    tree = []; 
 

 
data.forEach(function (a, i, aa) { 
 
    var lastDepth = (aa[i - 1] || {}).depth, o; 
 
    if (a.depth !== 0 && a.depth > lastDepth) { 
 
     o = this[lastDepth][this[lastDepth].length - 1] 
 
     o.children = o.children || []; 
 
     this[a.depth] = o.children; 
 
    } 
 
    this[a.depth].push({ name: a.name }); 
 
}, [tree]); 
 

 
console.log(tree);

0

Hier ist die Magie

var json = [ 
 
    { 
 
    "name": "ELECTRONICS", 
 
    "depth": 0 
 
    }, 
 
    { 
 
    "name": "TELEVISIONS", 
 
    "depth": 1 
 
    }, 
 
    { 
 
    "name": "TUBE", 
 
    "depth": 2 
 
    }, 
 
    { 
 
    "name": "PLASMA", 
 
    "depth": 2 
 
    }, 
 
    { 
 
    "name": "GAME CONSOLES", 
 
    "depth": 1 
 
    }, 
 
    { 
 
    "name": "MP3 PLAYERS", 
 
    "depth": 1 
 
    }, 
 
    { 
 
    "name": "FLASH", 
 
    "depth": 2 
 
    }]; 
 

 
var newJSON = []; 
 
function createTree(parentID, i, node, depth) 
 
{ 
 
    node.children = []; 
 
    delete node.depth; 
 
    while (i < json.length && json[i].depth > parentID) 
 
    { 
 
    if (depth === json[i].depth) 
 
    { 
 
     node.children.push(json[i]); 
 
    } 
 
    else 
 
    { 
 
     createTree(json[i-1].depth, i, json[i-1], depth + 1); 
 
    } 
 
    i++; 
 
    } 
 
    if (node.children.length === 0) 
 
    { 
 
    delete node.children; 
 
    } 
 
    return node; 
 
} 
 

 
var parent = {}; 
 
parent = createTree(-1, 0, parent, 0); 
 
console.log(parent.children); 
 
JSON.stringify(parent.children);

ich angenommen habe, dass, wenn die Tiefe des nächsten Feldelement gleich ist es ein Geschwister ist, wenn es Moll ist ein Kind und wenn es größer ist, müssen wir diesem Zweig keine weiteren Elemente hinzufügen. Also, ich erstelle einen Zweig, wenn es die gleiche Tiefe ist, füge ich es zu unserem Elternteil hinzu, wenn die Tiefe geringer ist, erstelle ich einen neuen Zweig und wenn es größer ist, höre ich auf, Zweige zu erstellen und untergeordnete Elemente hinzuzufügen.

EDIT

I-Lösung Nina Scholz holen würde, weil es einfacher ist,

0

Dies kann leider nicht bekannt

// Code goes here 
 

 
angular.module("app",[]) 
 
.controller("ctrl", function($scope, $log){ 
 
    
 
    $scope.src = [ 
 
    { 
 
    "name": "ELECTRONICS", 
 
    "depth": 0 
 
    }, 
 
    { 
 
    "name": "TELEVISIONS", 
 
    "depth": 1 
 
    }, 
 
    { 
 
    "name": "TUBE", 
 
    "depth": 2 
 
    }, 
 
    { 
 
    "name": "PLASMA", 
 
    "depth": 2 
 
    }, 
 
    { 
 
    "name": "GAME CONSOLES", 
 
    "depth": 1 
 
    }, 
 
    { 
 
    "name": "MP3 PLAYERS", 
 
    "depth": 1 
 
    }, 
 
    { 
 
    "name": "FLASH", 
 
    "depth": 2 
 
    }]; 
 
    
 
    $scope.tree = _.findWhere($scope.src, {"depth":0}); 
 
    
 
function makeTree(parentNode){ 
 
    var d = parentNode.depth +1;  
 
    var children = _.where($scope.src, {"depth" : parentNode.depth+1}); 
 

 
    if(children!=null){ 
 
     parentNode.children = children; 
 
     parentNode.children.forEach(function(c){ 
 
     makeTree(c); 
 
     }); 
 

 

 
    } 
 
    } 
 

 
    makeTree($scope.tree); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<script data-require="[email protected]" data-semver="1.5.2" src="//cdn.jsdelivr.net/underscorejs/1.5.2/underscore-min.js"></script> 
 
    
 
<body ng-app="app"> 
 
    
 
    <div ng-controller="ctrl"> 
 

 
     First Node : {{firstNode|json}} 
 
       <h1>tree</h1> 
 
     <pre>{{tree|json}}</pre> 
 
    </div> 
 
    </body>