js数组有父级关系转换json格式的问题

var nodes=[

        {id: 1,label: '1级',parentId:0},
        {id: 4,label: '2级',parentId:1},
        {id: 9,label: '3级1-1-1',parentId:4},
        {id: 10,label: '3级1-1-2',parentId:4}
            
    ]

求帮助,怎么转换成下面格式
[
{id:1,name:"1级"},
{id:4,name:"1级:2级"},
{id:9,name:"1级:2级:3级 1-1-1"},
{id:10,name:"1级:2级:3级 1-1-2"}
]
问题是这里的name赋值不知道怎么做,要显示所有的父级名称,例如{name:"1级:2级:3级 1-1-1"},

阅读 1.9k
4 个回答

var arr=JSON.parse(JSON.stringify(this.nodes));

    for(let j=0;j<arr.length;j++){
        for(let k=0;k<this.nodes.length;k++){
            if(arr[j].id==this.nodes[k].parentId){
                this.nodes[k].name=arr[j].label+":"+this.nodes[k].label;
                this.nodes[k].seconedId=this.nodes[k].id;
                arr[j].seconedId=this.nodes[k].id;
                arr[j].label=arr[j].label+":"+this.nodes[k].label;
            }
        };
    };

    for(let j=0;j<arr.length;j++){
        for(let k=0;k<this.nodes.length;k++){
            if(arr[j].seconedId==this.nodes[k].parentId){
                this.nodes[k].name=arr[j].label+":"+this.nodes[k].label;
            }
        }
    }

    console.log(this.nodes)
    
   其实就是根据parentId去循环查找  我随便写的 全是for循环  你看看步骤应该就知道了 
   至于其他的方法可能es6中会有吧

以下只是把各级的label拼起来了,没有在“3级”和“1-1-1”间加空格
你题目里的数据里“3级”和“1-1-1”中间是没有空格的,而你的结果示例里有空格,我不知道这是码错了还是确实想要那样的效果。

var nodes = [
    {id: 1, label: '1级', parentId: 0},
    {id: 4, label: '2级', parentId: 1},
    {id: 9, label: '3级1-1-1', parentId: 4},
    {id: 10, label: '3级1-1-2', parentId: 4}
]

function getParentNode(parentId) {
    return nodes.find(item => item.id == parentId)
}

function getName(node) {
    var pn = getParentNode(node.parentId)
    return !pn?node.label:getName(pn)+':'+node.label
}

nodes.map(item => ({id:item.id, name:getName(item)}))
新手上路,请多包涵
var nodes=[
  {id: 1,label: '1级',parentId:0},
  {id: 4,label: '2级',parentId:1},
  {id: 9,label: '3级1-1-1',parentId:4},
  {id: 10,label: '3级1-1-2',parentId:4}
]

function getNodesMap(nodes) {
  var map = {};
  nodes.forEach(node => {
    map[node.id] = node;
  });
  return map;
}

function getNodeLabel(node, nodeMap) {
  var str = '';
  if(nodeMap[node.parentId]) {
    str += getNodeLabel(nodeMap[node.parentId], nodeMap) + ':';
  }
  return str + node.label
}

function formatNodes(nodes) {
  var nodeMap = getNodesMap(nodes);
  return nodes.map(node => {
    return {
      id: node.id,
      name: getNodeLabel(node, nodeMap)
    };
  });
}

formatNodes(nodes);
var list = [
    {id: 1,label: 'a',parentId:0},
    {id: 2,label: 'b-1',parentId:1},
    {id: 4,label: 'b-2',parentId:1},
    {id: 5,label: 'b-1-1',parentId:2},
    {id: 6,label: 'b-1-2',parentId:2},
    {id: 9,label: 'c-1',parentId:4},
    {id: 10,label: 'c-2',parentId:4}
];

for(var i = 0; i < list.length; i++){
    var elem = list[i];
    var name = elem.label;
    //递归找到当前所有父元素,记录name
    while(elem.parentId != 0){
        //find方法,elem传递进去就是this
        elem = list.find(function(item){
            //this就是参数elem
            return item.id == this.parentId;
        },elem);
        name = elem.label + ';' + name;
    }
    list[i].name = name;
}
console.log(list);  
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题