Javascript:根据匹配的属性ID:

时间:2019-11-18 20:14:27

标签: javascript object key higher-order-functions

对于高阶函数还是很新的,并在可能的情况下尝试在此处正确使用它们。

我有一个从如下构造的api返回的对象数组:

[ {"gymId":3467, "halls": [{ "hallId": "25828", "instructorId": 1064, 
   "slotIds": [2088,2089], "sessionId":8188}, 
  {"hallId": "25848", "instructorId": 1067, "slotIds": [2088,2089], "sessionId": 8188 }]}]

我想要实现的预期结果是从上面的数组中创建诸如此类的对象的列表...

{2088: [{ "hallId":"25828", "instructorId":1064, "sessionId":8188 }, 
        { "hallId":"25848", "instructorId":1067, "sessionId":8188 }],
 2089: [{ "hallId":"25828", "instructorId":1064, "sessionId":8188 }, 
        { "hallId":"25848", "instructorId":1067, "sessionId":8188 }] 
}

我正在按照此思路进行思考

halls.reduce((acc, hall) => {
      hall.slotIdIds.forEach(slotId => {
        acc[slotId] = {
          //expected object properties as above here.
        };
      });
      return acc;
    }, {}),

问题是当我以这种方式减少时,仅返回一个hallId,而不返回存在插槽的两个匹配的Hall ID。

对于如何解决这一问题感到困惑,我将不胜感激任何提示。

1 个答案:

答案 0 :(得分:0)

以下代码达到了预期的结果。它虽然不起作用。

res = {}

// gyms is the array from api
gyms.forEach(gym => {
    gym.halls.forEach(hall => {
        hall.slotIds.forEach(slotId => {
            if (res[slotId] === undefined) res[slotId] = [];
            res[slotId].push({"hallId": hall.hallId, "instructorId": hall.instructorId, "sessionId": hall.sessionId});
        })
    })
})