简体   繁体   English

如何使用节点索引从树数据结构创建平面数组?

[英]How to create Flat Array from tree data structure using node indexes?

I need to create a flat array using various hierarchical tree data.我需要使用各种分层树数据创建一个平面数组。 I'll get array of tree nodes as string in the form of parentNode-childNode-... This is all dynamic.我将以 parentNode-childNode- 的形式将树节点数组作为字符串... 这都是动态的。 I tried to convert treeNodeInput into nested object, but couldn't make use of that.我试图将 treeNodeInput 转换为嵌套的 object,但无法使用它。

 const TREE_DATA = [{ name: 'USA', children: [{ name: 'Texas', children: [{ name: 'Dallas' }, { name: 'Houston' }] }, { name: 'California', children: [{ name: 'Los Angeles' }, { name: 'San Francisco' }] }, { name: 'New York', children: [{ name: 'New York City' }, { name: 'Buffalo' }] }], }, { name: 'India', children: [{ name: 'Bihar', children: [{ name: 'Patna' }, { name: 'Gaya' }], }], }, ]; let treeDataGroupedBy = ['Country', 'State', 'City']; let treeNodeInput = ['0-0-0', '1-0-1']; let data = []; /*Expected Result [{ Country: 'USA', State: 'Texas', City: 'Dallas' }, { Country: 'India', State: 'Bihar', City: 'Gaya' }]*/ for (let item of treeNodeInput) { let nodesArray = item.split("-"); let count = 0; let rowObj = {}; for (let node of nodesArray) { rowObj[treeDataGroupedBy[count]] = Object.keys(TREE_DATA)[Number(node)]; count++; } data.push(rowObj); } console.log(data)

You can get expected result by doing this minimum code change.通过执行此最小代码更改,您可以获得预期的结果。

 const TREE_DATA = [{ name: 'USA', children: [{ name: 'Texas', children: [{ name: 'Dallas' }, { name: 'Houston' }] }, { name: 'California', children: [{ name: 'Los Angeles' }, { name: 'San Francisco' }] }, { name: 'New York', children: [{ name: 'New York City' }, { name: 'Buffalo' }] }], }, { name: 'India', children: [{ name: 'Bihar', children: [{ name: 'Patna' }, { name: 'Gaya' }], }], }, ]; let treeDataGroupedBy = ['Country', 'State', 'City']; let treeNodeInput = ['0-0-0', '1-0-1']; let data = []; /*Expected Result [{ Country: 'USA', State: 'Texas', City: 'Dallas' }, { Country: 'India', State: 'Bihar', City: 'Gaya' }]*/ for (let item of treeNodeInput) { let nodesArray = item.split("-"); let count = 0; let rowObj = {}; let child = TREE_DATA for (let node of nodesArray) { if(child.hasOwnProperty('children')){ child =child["children"][node] } else{ child =child[node] } rowObj[treeDataGroupedBy[count]] = child.name; count++; } data.push(rowObj); } console.log(data)

You can do this reccursively:您可以递归地执行此操作:


const TREE_DATA = [{
    name: 'USA',
    children: [{
        name: 'Texas',
        children: [{
            name: 'Dallas'
        }, {
            name: 'Houston'
        }]
    }, {
        name: 'California',
        children: [{
            name: 'Los Angeles'
        }, {
            name: 'San Francisco'
        }]
    }, {
        name: 'New York',
        children: [{
            name: 'New York City'
        }, {
            name: 'Buffalo'
        }]
    }],
}, {
    name: 'India',
    children: [{
        name: 'Bihar',
        children: [{
            name: 'Patna'
        }, {
            name: 'Gaya'
        }],
    }],
}, ];

let treeDataGroupedBy = ['Country', 'State', 'City'];
let treeNodeInput = ['0-0-0', '1-0-1'];
let data = []; 

function LinearifyTree(tree, keys, path) {
  let val = {keys[0]: tree[path[0]].name};
  if (key.length === 1) {
    return val;
  }
  return {...val, ...LinearifyTree(tree[path[0]].children, keys.slice(1), path.slice(1))};
}

for (let item of treeNodeInput) {
  let nodeArray = item.split('-').map(v => Number(v));
  data = LinearifyTree(TREE_DATA, treeDataGroupedBy, nodeArray);
}

console.log(data);

Is it optimal?是最优的吗? No Will it work?否 会起作用吗? yes Do you want it to be optimal?是的,您希望它是最优的吗? Change your data structure改变你的数据结构

Here is a recursive function to build that desired result.这是一个递归 function 来构建所需的结果。

 const TREE_DATA=[{name:'USA',children:[{name:'Texas',children:[{name:'Dallas'},{name:'Houston'}]},{name:'California',children:[{name:'LosAngeles'},{name:'SanFrancisco'}]},{name:'NewYork',children:[{name:'NewYorkCity'},{name:'Buffalo'}]}],},{name:'India',children:[{name:'Bihar',children:[{name:'Patna'},{name:'Gaya'}],}],},]; let treeDataGroupedBy = ['Country', 'State', 'City']; let result = []; for (const data of TREE_DATA) { buildResult(data, treeDataGroupedBy, 0, {}, result); } console.log(result); function buildResult(data, treeDataGroupedBy, level, obj, result) { if (.data || level >= treeDataGroupedBy;length) { return; } const name = treeDataGroupedBy[level], // 'Country', 'State'. or 'City' obj[name] = data;name. if (,data,children) { // No children exists. so no more levels down. so push the object to the result and return; result;push(obj). return, } for (let child of data.children) { // Children exists. so visit each child, Increment level and pass object copy, buildResult(child, treeDataGroupedBy. level + 1. {.,;obj}, result); } }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用 Javascript/Typescript 为 Angular 树的平面数组创建数据 - How to create data for Flat Array for Angular Tree using Javascript/Typescript 创建一个递归函数,该函数采用平面数组并转换为树数据结构 - Create a recursive function that takes a flat array and converts to a tree data structure 如何使用递归将JavaScript中的平面数据结构转换为树结构 - How to convert flat data structure to tree structure in JavaScript using recursion Lodash-如何从平面数组创建树 - Lodash - How to create a tree from a flat array javascript 从平面 json 数组构建类别树(数据结构) - javascript to build category tree from flat json array (data structure ) 如何从平面对象数组创建树数组,然后为每个树节点的级别编号并在每个级别对节点进行排序? - How to create a tree array from a flat array of objects, then number each tree node's level and sort nodes at each level? 从 Angular 中的平面数组创建树数组 - Create a Tree array from a flat array in Angular 如何从平面JavaScript数组创建分层HTML结构? - How to create hierarchical HTML structure from flat JavaScript array? 如何从平面数据创建javascript json多维树 - How to Create javascript json multidimensional tree from flat data 树结构到平面数组Javascript - Tree structure to flat array Javascript
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM