因此,我对JS和使用循环从平面文件获得JSON树中的数据格式化非常陌生. 我正在try 构建一个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" }
    ]

我正试图将其纳入基于角色的 struct 中

{
    "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"
                }
            ]
        }
    ]
}

我首先构建角色 struct ,并创建总体数据 struct :

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:[]};
    });

当我试图遍历数据时,我不得不对数组段进行硬编码,而当我try 使用‘i’时,这是不起作用的.我不清楚,当数据与先前创建的数据 struct 中的角色匹配时,我到底需要做些什么才能让数据推送段.

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

推荐答案

您可以使用REDUTE.累加器充当从角色到表示该角色的对象的键/值存储映射.我们将每个输入元素添加到正确角色对象中的properties数组中.最后,我们使用Object.Values()来仅获取累加器中的角色对象array.

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)

Javascript相关问答推荐

如何为GrapesJS模板编辑器创建自定义撤销/重复按钮?

在贝塞尔曲线的直线上找不到交叉点:(使用@Pomax的bezier.js)

如何才能拥有在jQuery终端中执行命令的链接?

如何从URL获取令牌?

如何调用名称在字符串中的实例方法?

使用JQuery单击元素从新弹出窗口获取值

用于编辑CSS样式的Java脚本

虚拟滚动实现使向下滚动可滚动到末尾

并不是所有的iframe都被更换

扩展类型的联合被解析为基类型

为什么客户端没有收到来自服务器的响应消息?

让chart.js饼图中的一个切片变厚?

获取';无法解决导入和导入";slick-carousel/slick/slick-theme.css";';错误

为什么在函数中添加粒子的速率大于删除粒子的速率?

我的NavLink活动类在REACT-ROUTER-V6中出现问题

在传单的图像覆盖中重新着色特定 colored颜色 的所有像素

需要刷新以查看Mern堆栈应用程序中的更改

如果我将高度设置为其内容的100%,则在Java脚本中拖动以调整面板大小时会冻结

如何在Java脚本中添加一个可以在另一个面板中垂直调整大小的面板?

检测带有委托的元素内部的点击,以及元素何时按其类名被选中