JavaScript中的数据处理



刚接触JS,我来自Python世界,所以需要一些帮助。

我正在从B.E.获取一些数据,看起来像:

{
"Airports": {
"BCN": {
"Arrivals": [{ "flight": "BIO", "time": "1:00" , "passengers": 10}, { "flight": "VGU", "time" : "2.00","passengers": 20 }, {"flight": "MEX", "time": "3.00", "passengers": 30 } ],
"Departures": [{ "flight": "BIO", "time": "1:00" }, { "flight": "VGU", "time" : "2.00" }, {"flight": "MEX", "time": "3.00" }]
},

}
}

我想取每个机场的到达/离开数据,并将其转换为字典列表(键/值对),看起来像这样:

FlightData.Airports.BCN.Arrivals

[
{"0:00":[]},
{"1:00":["flight": BIO, "passengers": 10]},
{"2:00":["flight": VGU, "passengers": 20]},
{"3:00":["flight": MEX, "passengers": 30]},
]

有简单的方法可以做到这一点吗?这是我到目前为止所尝试的:

let arrivalDict = Object.keys(arrivals).reduce(
(acc: any, k: any) => (
(acc[arrivals[k]] = [...(acc[arrivals[k]] || []), k]), acc
),
{}
);

使用Lodash更好吗?

由于arrivals是一个数组,您不需要使用Object.keys()。循环遍历数组值。

我使用了一个for循环来创建一个字典,所有的小时作为键。然后,我使用forEach()循环将每个到达的字典推入相应的元素。

let arrivals = [{ "flight": "BIO", "time": "1:00" , "passengers": 10}, { "flight": "VGU", "time" : "2.00","passengers": 20 }, {"flight": "MEX", "time": "3.00", "passengers": 30 } ];
// Fill in all hours from 00:00 to 23:00
let arrivals_obj = {};
for (let hour = 0; hour < 24; hour++) {
arrivals_obj[`${hour}:00`] = [];
}
Object.values(arrivals).forEach(arrival =>
arrivals_obj[arrival.time.replace('.', ':')].push(arrival)
);
console.log(arrivals_obj)

有几种方法可以实现这一点,如果您不介意从时间数组开始,请考虑以下方法:

const data = {
"Airports": {
"BCN": {
"Arrivals": [
{ "flight": "BIO", "time": "1:00" , "passengers": 10}, 
{ "flight": "VGU", "time" : "2:00","passengers": 20 }, 
{"flight": "MEX", "time": "3:00", "passengers": 30 } 
],
"Departures": [
{ "flight": "BIO", "time": "1:00" }, 
{ "flight": "VGU", "time" : "2:00" }, 
{ "flight": "MEX", "time": "3:00" }
]
}
}
};
const times = ["0:00", "1:00", "2:00", "3:00"];
const result = Object.fromEntries(
times.map(t => [t, data.Airports.BCN.Arrivals.filter(arr => arr.time === t)])
);
console.log(result);