Javascript 具有父ID的平面层次json
我从另一个帖子上偷了这个脚本:Javascript 具有父ID的平面层次json,javascript,json,hierarchical,Javascript,Json,Hierarchical,我从另一个帖子上偷了这个脚本: function convertToHierarchy() { var arry = [{ "Id": "1", "Name": "abc", "Parent": "", "attr": "abc" }, { "Id": "2", "Name": "abc", "Parent": "1", "attr": "abc" }, { "Id": "3", "Name": "abc", "Parent": "2
function convertToHierarchy() {
var arry = [{ "Id": "1", "Name": "abc", "Parent": "", "attr": "abc" },
{ "Id": "2", "Name": "abc", "Parent": "1", "attr": "abc" },
{ "Id": "3", "Name": "abc", "Parent": "2", "attr": "abc" },
{ "Id": "4", "Name": "abc", "Parent": "2", "attr": "abc" }];
var nodeObjects = createStructure(arry);
for (var i = nodeObjects.length - 1; i >= 0; i--) {
var currentNode = nodeObjects[i];
if (currentNode.value.Parent === "") {
continue;
}
var parent = getParent(currentNode, nodeObjects);
if (parent === null) {
continue;
}
parent.children.push(currentNode);
nodeObjects.splice(i, 1);
}
console.dir(nodeObjects);
return nodeObjects;
}
function createStructure(nodes) {
var objects = [];
for (var i = 0; i < nodes.length; i++) {
objects.push({ value: nodes[i], children: [] });
}
return objects;
}
function getParent(child, nodes) {
var parent = null;
for (var i = 0; i < nodes.length; i++) {
if (nodes[i].value.Id === child.value.Parent) {
return nodes[i];
}
}
return parent;
}
我要找的是:
[{
"Id": "1",
"Name": "abc",
"Parent": "",
"attr": "abc",
"children": [{
"Id": "2",
"Name": "abc",
"Parent": "1",
"attr": "abc",
"children": [{
"Id": "4",
"Name": "abc",
"Parent": "2",
"attr": "abc"
}, {
"Id": "3",
"Name": "abc",
"Parent": "2",
"attr": "abc"
}]
}]
}]
我需要首先去掉“value”包装器,其次去掉空的子节点。
我知道我可以写一个清理脚本,但这并不是最佳实践。
如果有人知道如何修复,或者建议一个不同的脚本,那就太好了
谢谢试试类似的东西
var arry = [{ "Id": "1", "Name": "abc", "Parent": "", "attr": "abc" },
{ "Id": "2", "Name": "abc", "Parent": "1", "attr": "abc" },
{ "Id": "3", "Name": "abc", "Parent": "2", "attr": "abc" },
{ "Id": "4", "Name": "abc", "Parent": "2", "attr": "abc" }];
function convert(array){
var map = {};
for(var i = 0; i < array.length; i++){
var obj = array[i];
obj.items= [];
map[obj.Id] = obj;
var parent = obj.Parent || '-';
if(!map[parent]){
map[parent] = {
items: []
};
}
map[parent].items.push(obj);
}
return map['-'].items;
}
var r = convert(arry)
函数转换(行){
函数存在(行、父级){
对于(变量i=0;i
@Arun p Johny的答案是好的,但它有一个问题,当数组未排序时,它将刷新子树。我把它更新成这样
var arry = [
{ "Id": "5", "Name": "abc", "Parent": "3", "attr": "abc" },
{ "Id": "2", "Name": "abc", "Parent": "1", "attr": "abc" },
{ "Id": "4", "Name": "abc", "Parent": "2", "attr": "abc" },
{ "Id": "3", "Name": "abc", "Parent": "2", "attr": "abc" },
{ "Id": "1", "Name": "abc", "Parent": "", "attr": "abc" }
];
function convert(array){
var map = {}
for(var i = 0; i < array.length; i++){
var obj = array[i]
if(!(obj.Id in map)){
map[obj.Id] = obj
map[obj.Id].children = []
}
if(typeof map[obj.Id].Name == 'undefined'){
map[obj.Id].Id = obj.Id
map[obj.Id].Name = obj.Name
map[obj.Id].attr = obj.attr
map[obj.Id].Parent= obj.Parent
}
var parent = obj.Parent || '-';
if(!(parent in map)){
map[parent] = {}
map[parent].children = []
}
map[parent].children.push(map[obj.Id])
}
return map['-']
}
console.log(JSON.stringify(convert(arry)))
//像这样试试
function prepareFlatArrayListToTreeViewList(arry) {
var treeviewList= angular.copy(flatListToTreeViewData(arry));
return treeviewList;
}
//返回json格式的数据
function flatListToTreeViewData(dataList) {
var tree = [],
mappedArr = {},
arrElem,
mappedElem;
// First map the nodes of the array to an object -> create a hash table.
for (var i = 0, len = dataList.length; i < len; i++) {
arrElem = dataList[i];
mappedArr[arrElem.id] = arrElem;
mappedArr[arrElem.id]['children'] = [];
}
for (var id in mappedArr) {
if (mappedArr.hasOwnProperty(id)) {
mappedElem = mappedArr[id];
// If the element is not at the root level, add it to its parent array of children.
if (mappedElem.parentID) {
mappedArr[mappedElem['parentID']]['children'].push(mappedElem);
}
// If the element is at the root level, add it to first level elements array.
else {
tree.push(mappedElem);
}
}
}
return tree;
}
函数flatListToTreeViewData(数据列表){
var-tree=[],
mappedArr={},
阿瑞勒姆,
mappedElem;
//首先将数组的节点映射到对象->创建哈希表。
for(var i=0,len=dataList.length;i
改进版,接受参数
函数转换(行、选项){
var options=options |{};
var idProp=options.id | |“id”;
var parentProp=options.parent | |“parent”;
var childProp=options.children | |“children”;
函数存在(行、父级){
对于(变量i=0;i }
Arun,你知道如何将“children”属性标题重命名为“items”?如果我更改数组元素的顺序,它将不起作用。例如,如果我将数组元素(即Id 1)的位置更改为数组的最后一个位置,则此方法将不起作用。还有什么方法可以适应这种情况吗?@JetsonJohn你有没有弄明白,如果数据是id不是顺序的,我有一个类似的要求。id不是连续的,因此所有子项都是连续的empty@ArunPJohny我对json对象中多了一层嵌套的类似问题感到震惊。我在这里发布了一个与之相关的问题-。你能建议一下如何解决这个问题吗?我认为这个答案更好。即使顶级节点不是数组的第一个元素,这也可以正常工作。
var arry = [
{ "Id": "5", "Name": "abc", "Parent": "3", "attr": "abc" },
{ "Id": "2", "Name": "abc", "Parent": "1", "attr": "abc" },
{ "Id": "4", "Name": "abc", "Parent": "2", "attr": "abc" },
{ "Id": "3", "Name": "abc", "Parent": "2", "attr": "abc" },
{ "Id": "1", "Name": "abc", "Parent": "", "attr": "abc" }
];
function convert(array){
var map = {}
for(var i = 0; i < array.length; i++){
var obj = array[i]
if(!(obj.Id in map)){
map[obj.Id] = obj
map[obj.Id].children = []
}
if(typeof map[obj.Id].Name == 'undefined'){
map[obj.Id].Id = obj.Id
map[obj.Id].Name = obj.Name
map[obj.Id].attr = obj.attr
map[obj.Id].Parent= obj.Parent
}
var parent = obj.Parent || '-';
if(!(parent in map)){
map[parent] = {}
map[parent].children = []
}
map[parent].children.push(map[obj.Id])
}
return map['-']
}
console.log(JSON.stringify(convert(arry)))
{
"children": [
{
"children": [
{
"Id": "2",
"Name": "abc",
"Parent": "1",
"attr": "abc",
"children": [
{
"Id": "4",
"Name": "abc",
"Parent": "2",
"attr": "abc",
"children": []
},
{
"children": [
{
"Id": "5",
"Name": "abc",
"Parent": "3",
"attr": "abc",
"children": []
}
],
"Id": "3",
"Name": "abc",
"attr": "abc",
"Parent": "2"
}
]
}
],
"Id": "1",
"Name": "abc",
"attr": "abc",
"Parent": ""
}
]
}
function prepareFlatArrayListToTreeViewList(arry) {
var treeviewList= angular.copy(flatListToTreeViewData(arry));
return treeviewList;
}
function flatListToTreeViewData(dataList) {
var tree = [],
mappedArr = {},
arrElem,
mappedElem;
// First map the nodes of the array to an object -> create a hash table.
for (var i = 0, len = dataList.length; i < len; i++) {
arrElem = dataList[i];
mappedArr[arrElem.id] = arrElem;
mappedArr[arrElem.id]['children'] = [];
}
for (var id in mappedArr) {
if (mappedArr.hasOwnProperty(id)) {
mappedElem = mappedArr[id];
// If the element is not at the root level, add it to its parent array of children.
if (mappedElem.parentID) {
mappedArr[mappedElem['parentID']]['children'].push(mappedElem);
}
// If the element is at the root level, add it to first level elements array.
else {
tree.push(mappedElem);
}
}
}
return tree;
}