[英]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 方式 map 从 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
属性的长度来做到这一点。 一个更简单的方法是在同一个bays
属性上使用map()
,如下所示: result1[0].bays.map()
。
在此之后,我们可以按照result2
所需的格式重建 object,并将这些新对象映射回我们正在创建的新数组。 要添加number
属性,我们可以像{number}
一样简单地将它添加到 return object 中,对于新的times
属性,我们需要使用map()
遍历原始result1
数组,并在下面检索匹配的 object bays
属性的number
属性值与我们在顶级数组中迭代的值相匹配。 为此,我们只想保留availability
属性,因为我们已经在上层 object 中设置了时间属性。
result1[0].bays.map(({number}) => ({number, times: result1.map(({time, bays}) => ({time, availability: bays.find(bay => bay.number === number).availability})) }))
最后,我们只需要对返回的 object 进行排序,以便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 }
]
}
]
*/
我们还可以创建一个 function 对您的数组执行相同的计算并返回一个按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);
您可以将您的阵列缩减为 Object 键入托架编号,然后转换回列表。
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);
*我更改了结果 1 中的一些值,以result1
间隔的数字排序是正确的,并且可用性被适当地映射,因为原始样本对于所有间隔和时间都是false
的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.