我如何映射这个结果?

How do I map this result?

这不是考试题或其他任何问题,我正在做一个个人项目,但在这个问题上真的很迷雾。我希望能从社区得到一些帮助:)

我有一个数组...

const result1 = [
{ "time":"17 : 30","bays":[{"number":"bay-3","availability":false},{"number":"bay-2","availability":false},{"number":"bay-1","availability":false}]},

{"time":"18 : 00","bays":[{"number":"bay-3","availability":false},{"number":"bay-2","availability":false},{"number":"bay-1","availability":false}]},

{"time":"18 : 30","bays":[{"number":"bay-3","availability":false},{"number":"bay-2","availability":false},{"number":"bay-1","availability":false}]}];

但是我怎样才能以一种干净的 esnext 方式将数据从 result1 映射到 result2?

const result2 = [
{ "number":"bay-1”,”times”:[{“time":"17 : 30","availability":false},{"time":"18 : 00","availability":false},{"time":"18 : 30","availability":false}]},

{"number":"bay-2”,”times”:[{“time":"17 : 30","availability":false},{"time":"18 : 00","availability":false},{"time":"18 : 30","availability":false}]},

{"number":"bay-3””,”times”:[{“time":"17 : 30","availability":false},{"time":"18 : 00","availability":false},{"time":"18 : 30","availability":false}]}];

对于此任务,我们首先要创建一个新数组,其中包含我们将组织的新值,在本例中为 number 属性。我们可以通过从其中一个嵌套对象 Array(result1[0].bays.length).fill().map() 中检索 bays 属性 的长度来做到这一点。一个更简单的方法是 map() 覆盖相同的 bays 属性 像这样:result1[0].bays.map().

在此之后,我们可以以 result2 所需的格式重建对象,并将这些新对象映射回我们正在创建的新数组。要添加 number 属性,我们可以简单地将它添加到 return 对象,就像这样 {number},对于新的 times 属性,我们'将需要使用 map() 遍历原始 result1 数组,并检索 bays 属性 下具有 number [=45= 的匹配对象] 值匹配我们在顶级数组中迭代的值。为此,我们只想保留 availability 属性,因为我们已经在上层对象中设置了时间 属性。

result1[0].bays.map(({number}) => ({number, times: result1.map(({time, bays}) => ({time, availability: bays.find(bay => bay.number === number).availability})) }))

最后,我们只需要对 returned 对象进行排序,以便 result1 按编号排序。这会给你你想要的结果:

result1[0].bays.map(({number}) => ({number, times: result1.map(({time, bays}) => ({time, availability: bays.find(bay => bay.number === number).availability})) }))
  .sort((a,b) => a.number.split('-').reverse()[0] - b.number.split('-').reverse()[0])

/* -> [
        {
          number: "bay-1",
          times: [
            { time: "17 : 30", availability: false },
            { time: "18 : 00", availability: false },
            { time: "18 : 30", availability: false }
          ]
        },
        {
          number: "bay-2",
          times: [
            { time: "17 : 30", availability: false },
            { time: "18 : 00", availability: false },
            { time: "18 : 30", availability: false }
          ]
        },
        {
          number: "bay-3",
          times: [
            { time: "17 : 30", availability: false },
            { time: "18 : 00", availability: false },
            { time: "18 : 30", availability: false }
          ]
        }
      ]
*/

我们还可以创建一个函数,对您的数组执行相同的计算,returns 一个由 number 属性:

排列的新数组

const result1 = [
    { time: "17 : 30", bays: [{ number: "bay-3", availability: false }, { number: "bay-2", availability: false }, { number: "bay-1", availability: false }] },
    { time: "18 : 00", bays: [{ number: "bay-3", availability: false }, { number: "bay-2", availability: false }, { number: "bay-1", availability: false }] },
    { time: "18 : 30", bays: [{ number: "bay-3", availability: false }, { number: "bay-2", availability: false }, { number: "bay-1", availability: false }] }
];

const organizeByNumber = arr => arr[0].bays.map(({number}) => ({number, times: arr.map(({time, bays}) => ({time, availability: bays.find(bay => bay.number === number).availability})) })).sort((a,b) => a.number.split('-').reverse()[0] - b.number.split('-').reverse()[0]);

const result2 = organizeByNumber(result1);

console.log(result2);

您可以将您的数组缩减为键控到车位编号的对象,然后再转换回列表。

const result1 = [
    {
        "time": "17 : 30",
        "bays": [
            {"number": "bay-10", "availability": false},
            {"number": "bay-2", "availability": false},
            {"number": "bay-1", "availability": false}
        ]
    },

    {
        "time": "18 : 00",
        "bays": [
            {"number": "bay-10", "availability": false},
            {"number": "bay-2", "availability": true},
            {"number": "bay-1", "availability": false}
        ]
    },

    {
        "time": "18 : 30",
        "bays": [
            {"number": "bay-10", "availability": true},
            {"number": "bay-2", "availability": false},
            {"number": "bay-1", "availability": false}
        ]
    }];

const result2 = Object.entries(
    result1.reduce((acc, {bays, time}) => {
            bays.forEach(({number, availability}) => {
                acc[number] = (acc[number] || []).concat({
                    "availability": availability,
                    "time": time
                });
            });
            return acc;
        }, {}
    ))
    .reduce((acc, [bayNumber, times]) => {
        return acc.concat({"number": bayNumber, "times": times});
    }, [])
    .sort((a, b) => a.number.localeCompare(b.number, undefined,
        {numeric: true, sensitivity: 'base'}));

console.log(result2);

*我更改了 result1 中的一些值以确认间隔的数字排序是正确的,并且可用性已适当映射,因为原始样本对所有间隔和时间都有 false