使用 JS 从平面文件构建树形结构 JSON

问题描述 投票:0回答:1

所以我对 JS 很陌生,并且使用循环从平面文件获取 JSON 树格式的数据。 我正在尝试构建 SAP UI5 应用程序并将数据加载到树表中。

我有这个数据

roles: [ { role: 'JLP', desc: "jlp role", query:"q1" }, { role: 'JLP', desc: "jlp role", query:"q2" }, { role: 'JLP', desc: "jlp role", query:"q3" }, { role: 'DJF', desc: "djf role", query:"q1" }, { role: 'DJF', desc: "djf role", query:"q2" }, { role: 'CJ', desc: "CJ role", query:"q1" } ]

我正在尝试将其纳入基于角色的结构中

{ "roles": [ { "rolename": "JLP", "properties": [ { "role": "JLP", "desc": "jlp role", "query": "q1" }, { "role": "JLP", "desc": "jlp role", "query": "q2" }, { "role": "JLP", "desc": "jlp role", "query": "q3" } ] }, { "rolename": "DJF", "properties": [ { "role": "DJF", "desc": "djf role", "query": "q1" }, { "role": "DJF", "desc": "djf role", "query": "q2" } ] }, { "rolename": "CJ", "properties": [ { "role": "CJ", "desc": "cj role", "query": "q1" } ] } ] }

我首先搭建角色结构,制作整体数据结构:

`buildData:function(o){
//find all types of roles
var unique= [];
for(i = 0; i < o.length; i++){
  var rolename = o[i].role;

  if(unique.indexOf(rolename)< 0) unique.push(rolename);
}

//create data structure
var datForm ={results:{roles:[]}};
 var prop = {rolename:"",
           properties:[]};
unique.forEach(function(a,index){
  prop.rolename = a
  datForm.results.roles.push(prop)
  prop = {rolename:"",
           properties:[]};
 
 
});`

我遇到困难的是,当我尝试循环数据时,我必须对数组段进行硬编码,并且当我尝试使用“i”时它不起作用。我不清楚当数据与先前创建的数据结构中的角色匹配时,我到底需要做什么来获取数据来推送段。

 `for(i = 0; i < o.length; i++){
  var current = o[i].role;
  var segment = o[i];
 
  if(current === datForm.results.roles[0].rolename) 
    datForm.results.roles[0].properties.push(segment)
  if(current === datForm.results.roles[1].rolename) 
    datForm.results.roles[1].properties.push(segment)
    if(current === datForm.results.roles[2].rolename) 
    datForm.results.roles[2].properties.push(segment)
    }

//console.log(datForm)
var oModel = this.getView().getModel();
oModel.setData(datForm)
this.getView().byId("TreeTableBasic").bindRows("/results")`

这是可行的,但是如果我使用角色较少或较多的数据,它基本上会崩溃并且无法工作。您能推荐更好的方法吗?谢谢! 这是我正在处理的示例:https://jsbin.com/kovevej/edit?html,js,output

javascript json for-loop formatting flat-file
1个回答
0
投票

您可以使用reduce。累加器充当从角色到代表该角色的对象的键/值存储映射。我们将每个输入元素添加到正确对象中的

properties
数组中。最后,我们使用 Object.values() 来获取累加器中的值数组。

const data = [ { role: 'JLP', desc: "jlp role", query:"q1" }, { role: 'JLP', desc: "jlp role", query:"q2" }, { role: 'JLP', desc: "jlp role", query:"q3" }, { role: 'DJF', desc: "djf role", query:"q1" }, { role: 'DJF', desc: "djf role", query:"q2" }, { role: 'CJ', desc: "CJ role", query:"q1" } ]

const output = {
  roles: Object.values(data.reduce((a, {role, desc, query}) => (
    (a[role] ??= {rolename: role, properties: []})
      .properties.push({role, desc, query}), a), {}))
}

console.log(output)

© www.soinside.com 2019 - 2024. All rights reserved.