Отобразить `JSON string` в` tree` в javascript - PullRequest
2 голосов
/ 23 апреля 2020

У меня 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 nodes как здесь

1 Ответ

2 голосов
/ 23 апреля 2020

Вы можете применить рекурсивный подход к объектам, проверив тип передаваемых данных.

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; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...