【问题标题】:Convert an object to 3d array将对象转换为 3d 数组
【发布时间】:2021-11-17 23:45:31
【问题描述】:

我是 node.js 和 javascript 的新手。我正在尝试构建一个 REST API。

出于特定目的,我需要将对象转换为 3d 数组。

我尝试运行 foreach 循环,但它没有提供我想要实现的目标。

我的对象看起来像这样。

"data": [
    {
        "id": 15184,
        "badge_id": "330886",
        "name": "Rukmani J. Solanki",
        "gender": "Female",
        "type": "PF",
        "department": "Sales",
        "checkin": "2021-09-24T08:52:44.000Z",
        "checkout": "2021-09-24T08:57:45.000Z",
        "hours": "00:05"
    },
    {
        "id": 15185,
        "badge_id": "440886",
        "name": "Jairam J. Solanki",
        "gender": "Male",
        "type": "PM",
        "department": "Sales",
        "checkin": "2021-09-24T09:28:32.000Z",
        "checkout": null,
        "hours": null
    }
]

我想要这样的东西

{
    "onfield": [
        {
            "key": "Sales",
            "data": {
                "PM": [
                    {
                        "name": "Gokuldas S. Sundrani",
                        "badge_id": "441101",
                        "gender": "Male",
                        "checkIn": "2021-09-24 06:04:18",
                        "checkOut": null,
                        "hours": "NoCheckOut"
                    },
                    {
                        "name": "Satnamsingh M. Chhabra",
                        "badge_id": "551249",
                        "gender": "Male",
                        "checkIn": "2021-09-24 06:47:31",
                        "checkOut": "2021-09-24 08:32:00",
                        "hours": "1.7 Hours"
                    },
                    {
                        "name": "Praveen N. Jethwani",
                        "badge_id": "771328",
                        "gender": "Male",
                        "checkIn": "2021-09-24 07:14:11",
                        "checkOut": "2021-09-24 08:29:34",
                        "hours": "1.3 Hours"
                    },
                    {
                        "name": "Satnamsingh M. Chhabra",
                        "badge_id": "88249",
                        "gender": "Male",
                        "checkIn": "2021-09-24 08:32:00",
                        "checkOut": null,
                        "hours": "NoCheckOut"
                    },
                    {
                        "name": "Arjundas D. Chhabra",
                        "badge_id": "661248",
                        "gender": "Male",
                        "checkIn": "2021-09-24 10:19:22",
                        "checkOut": "2021-09-24 18:38:32",
                        "hours": "8.3 Hours"
                    },
                    {
                        "name": "Parmanand C. Lalwani",
                        "badge_id": "8651418",
                        "gender": "Male",
                        "checkIn": "2021-09-24 14:51:08",
                        "checkOut": "2021-09-24 17:39:27",
                        "hours": "2.8 Hours"
                    },
                    {
                        "name": "Dhanalal G. Chouhan",
                        "badge_id": "5501392",
                        "gender": "Male",
                        "checkIn": "2021-09-24 14:58:46",
                        "checkOut": "2021-09-24 18:20:50",
                        "hours": "3.4 Hours"
                    }
                ],
                "PF": [
                    {
                        "name": "Baljeetkaur S. Chhabra",
                        "badge_id": "501993",
                        "gender": "Female",
                        "checkIn": "2021-09-24 06:47:48",
                        "checkOut": "2021-09-24 08:32:12",
                        "hours": "1.7 Hours"
                    },
                    {
                        "name": "Baljeetkaur S. Chhabra",
                        "badge_id": "801993",
                        "gender": "Female",
                        "checkIn": "2021-09-24 08:32:12",
                        "checkOut": null,
                        "hours": "NoCheckOut"
                    }
                ],
                "OM": [
                    {
                        "name": "Yadvendra Bhati",
                        "badge_id": "2255454",
                        "gender": "male",
                        "checkIn": "2021-09-24 13:38:37",
                        "checkOut": "2021-09-24 17:24:11",
                        "hours": "3.8 Hours"
                    }
                ],
                "OF": [
                    {
                        "name": "Yashoda Bhati",
                        "badge_id": "223F0029",
                        "gender": "Female",
                        "checkIn": "2021-09-24 13:38:44",
                        "checkOut": "2021-09-24 17:24:25",
                        "hours": "3.8 Hours"
                    }
                ]
            }
        }
    ]
}

如何做到这一点?

非常感谢您的帮助。

我已经用谷歌搜索过 StackOverflow,但没有找到任何可以解决此类问题的内容。

谢谢

【问题讨论】:

  • 请尝试一下。如果它不起作用,请发布您尝试过的内容以及实际行为和任何错误消息。否则,我们只会为您解决问题,而您不会学到很多东西。
  • 您的数据结构也没有正确缩进并且在语法上无效,因此难以可视化。请帮助我们帮助您。
  • 请修复/编辑您的问题,不要在评论中发布您的代码
  • “我尝试运行 foreach 循环,但它没有提供我想要实现的目标。”没有告诉我们您实际尝试了什么。

标签: javascript node.js arrays multidimensional-array


【解决方案1】:

虽然我完全同意胡安·门德斯的观点,但这里有一个提示,以便您能够做到这一点。您可能会为您的数据获得一个中间表格,如下所示:

{
  "onfield": [
    {
      "key": "dept1",
      "data": {
        "PM": [
          {
            "id": 123,
            "badge_id": "1231",
            "name": "name1",
            "gender": "Male"
          }
        ]
      }
    },
    {
      "key": "dept2",
      "data": {
        "PF": [
          {
            "id": 124,
            "badge_id": "1232",
            "name": "name2",
            "gender": "Female"
          }
        ]
      }
    },
    {
      "key": "dept1",
      "data": {
        "PM": [
          {
            "id": 125,
            "badge_id": "1233",
            "name": "name3",
            "gender": "Male",
            "type": "PM",
            "dept": "dept1"
          }
        ]
      }
    }
  ]
}

也许将您的源数据转换为这个更容易。从这里到达你的目标只需合并相同类型的数组即可。

不要犹豫,问这是否一直很困难。但如前所述,请尝试自己解决这个问题,这就是你要学习的方式。

【讨论】:

    【解决方案2】:

    let data = [{ "id": 123, "badge_id": "1231", "name": "name1", "gender": "Male", "type": "PM", "dept": "dept1" }, { "id": 124, "badge_id": "1232", "name": "name2", "gender": "Female", "type": "PF", "dept": "dept2" }, { "id": 125, "badge_id": "1233", "name": "name3", "gender": "Male", "type": "PM", "dept": "dept1" }];
    let Report = []
    
    data.forEach((item) => {
        let obj = Report.find(v => v.dept == item.dept);
        if (!obj) Report.push(obj = {
            dept: item.dept,
            type: {}
        });
        obj.type[item.type] ??= [];
        obj.type[item.type].push({
            id: item.id,
            badge_id: item.badge_id,
            name: item.name,
            gender: item.gender,
        });
    })
    
    console.log(Report)

    【讨论】:

      【解决方案3】:

      这是我认为比你的结果更可行的东西..结帐

      let myObject = {
      
        "data": [ {
          "id": 123,
          "badge_id": "1231",
          "name": "name1",
          "gender": "Male",
          "type": "PM",
          "dept": "dept1"
        },
          {
            "id": 124,
            "badge_id": "1232",
            "name": "name2",
            "gender": "Female",
            "type": "PF",
            "dept": "dept2"
          },
          {
            "id": 125,
            "badge_id": "1233",
            "name": "name3",
            "gender": "Male",
            "type": "PM",
            "dept": "dept1"
          }]
      }
      
      function generateReport(object) {
        let obj = {
          "Report": []
        };
        let  types = [];
        object.data.forEach(arr =>{
          if(!types.includes(arr.type)){
          types.push(arr.type);
          }
        });
        
        types.forEach(type =>{
          obj.Report.push({
            type : type,
            users : object.data.filter(arr=>{ let a = arr.type == type;
               if(a){
                 delete arr.type;
               }
              return a;
           })
          });
        });
        return obj;
      }
      
      myObject = generateReport(myObject);
      console.log(myObject)
      
      

      【讨论】:

      • @Akash G 我认为如果您使用PMPF 作为您的密钥会更好! (或者也许只有部门)
      【解决方案4】:

      您可以在数组中获取所需的分组键并解构对象以从对象中删除此键。

      每个键都有自己的嵌套对象结构。

      const
          data = [{ id: 123, badge_id: "1231", name: "name1", gender: "Male", type: "PM", dept: "dept1" }, { id: 124, badge_id: "1232", name: "name2", gender: "Female", type: "PF", dept: "dept2" }, { id: 125, badge_id: "1233", name: "name3", gender: "Male", type: "PM", dept: "dept1" }],
          keys = ['dept', 'type'],
          result = data
              .reduce((r, o) => {
                  keys
                      .reduce(function (t, k) {
                          let key;
                          ({ [k]: key, ...o } = o);
                          if (!t[key]) t._.push({ [k]: key, data: (t[key] = { _: [] })._ });
                          return t[key];
                      }, r)
                      ._
                      .push(o);
                  return r;
              }, { _: [] })
              ._;
      
      console.log(result);
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

        猜你喜欢
        • 2015-11-25
        • 2021-05-03
        • 2018-12-04
        • 2021-06-16
        • 1970-01-01
        • 1970-01-01
        • 2019-07-11
        相关资源
        最近更新 更多