【问题标题】:Map `JSON string` to `tree` in javascript在javascript中将`JSON字符串`映射到`tree`
【发布时间】:2020-04-23 19:21:19
【问题描述】:

我有JSON 形式为{"Others": null, "Main Hobbies": {"Dance": ["Salsa", "Solo"], "Sports": ["Cricket"]}, "Game": ["PUBG", "Cricket", "Football"]}'

我想把它转换成tree structure

 data =   [
// not include Others since it is null
{ name: 'Main Hobbies',
  checked: false,
  children: [
      { name: 'Dance', checked: false, children: [ { name: 'Salsa', checked: false },{ name: 'Solo', checked: false }] },
      { name: 'Sports' , checked : false , children [{name :'Cricket',checked:false}]}
  ]
},
{ name: 'Game', checked: false ,children:[{name:"PUBG",checked:false},{name:"Cricket",checked:false},{name:"Football",checked:false}]},

到目前为止,这是我使用以下函数的方式,但不是将其转换为 tree 结构,而是将其转换为列表结构,即最多仅 two levels。但是所需的输出是 Three level

let data = {"Others": null, "Main Hobbies": {"Dance": ["Salsa", "Solo"], "Sports": ["Cricket"]}, "Game": ["PUBG", "Cricket", "Football"]};
var result = filterData(data);
function filterData(data){
    let result = [];
    for (var key in data){
      var value = data[key];
      let val = data[key];
      if(val){
        if(Array.isArray(val) && val.length>0){
          let ob ={};
          ob['name'] = key;
          ob['checked']=false;
          ob['children'] = getChildren(val);   
          result.push(ob);  
       }else if(typeof val == 'object'){
         let ob ={};
         ob['name'] = key;
         ob['checked']=false;
         ob['chldren']=filterData(val);
         result.push(filterData(val));
       }
    
     }
    }
    return result;
  }
  function getChildren(data){
    let result = [];
    data.forEach(function(e){
      let ob = {};
      ob['name'] = e;
      ob['checked']=false;
       if(Array.isArray(e.children) && e.children.length){
           ob['children'] = getChildren(e.children);
         }
       result.push(ob);  
    })
    return result;
  
    
  }
  console.log(result);
 ];

想转换tree nodeslike here

【问题讨论】:

    标签: javascript arrays ecmascript-6


    【解决方案1】:

    您可以通过检查移交数据的类型来对对象采取递归方法。

    function create(data, checked = false) {
        return Array.isArray(data)
            ? data.map(name => ({ name, checked }))
            : Object
                .entries(data)
                .filter(([, v]) => v !== null && (!Array.isArray(v) || v.length))
                .map(([name, value]) => ({
                    name,
                    checked,
                    children: create(value, checked)
                }))
    }
    
    var data = { empty: [], Others: null, "Main Hobbies": { Dance: ["Salsa", "Solo"], Sports: ["Cricket"] }, Game: ["PUBG", "Cricket", "Football"] },
        result = create(data);
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 你的头脑现在已经硬连线可以在半秒内完成这些事情:D
    • @Nina Scholz 工作正常,请让我发烧,例如如何处理[] 类似于null 的案件
    • @NinaScholz 如果我想考虑Null 以及尝试return Array.isArray(data) ? data.map(name => ({ name, checked })) : Object .entries(data).map(([name, value]) => ({ name, checked, children: create(value, checked) })) 但它不起作用
    • 所以对于这种情况{ name: 'Others', checked: false}
    • 那么你需要这部分:.filter(([, v]) => !Array.isArray(v) || v.length) .map(([name, value]) => value === null ? { name, checked } : { name, checked, children: create(value, checked) } )
    猜你喜欢
    • 2016-10-15
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多