繁体   English   中英

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

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

我需要使用各种分层树数据创建一个平面数组。 我将以 parentNode-childNode- 的形式将树节点数组作为字符串... 这都是动态的。 我试图将 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)

通过执行此最小代码更改,您可以获得预期的结果。

 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)

您可以递归地执行此操作:


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

是最优的吗? 否 会起作用吗? 是的,您希望它是最优的吗? 改变你的数据结构

这是一个递归 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM