2016-07-21 3 views
4

У меня есть эта структура данных, которые показывают глубину каждого узла в дереве вложенного:Создание JSON из вложенного набора модели 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 
    }] 

Я хотел бы, чтобы преобразовать данные превью с JavaScript/Node.js/Угловое в иерархическом формате JSON как это:

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

Глубина, к сожалению, не известно – Danilo

ответ

4

Вы можете использовать Array#forEach и массив для ссылки на глубину.

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

Вот магия

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

Я предположил, что если глубина следующего элемента массива равно это родной брат, если это minor это дети, и если это больше, нам не нужно добавлять в эту ветку больше элементов. Итак, я создаю ветвь, если она равна той же глубине, я добавляю ее к нашему родителю, если глубина меньше, я создаю новую ветку, и если она больше, я перестаю создавать ветви и добавляю детей в «мой» родитель.

EDIT

Я бы выбрал решение Нины Scholz, потому что это легче понять

0

Это может помочь

// 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>

Смежные вопросы