我如何映射这个结果?
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
。
这不是考试题或其他任何问题,我正在做一个个人项目,但在这个问题上真的很迷雾。我希望能从社区得到一些帮助:)
我有一个数组...
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
。