#javascript #arrays #typescript #javascript-objects #data-manipulation
Вопрос:
Новичок в JS, я родом из мира Python, поэтому мне нужна помощь.
Я получаю некоторые данные от Б. Е., которые выглядят примерно так:
{
"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" }]
},
}
}
Я хочу собрать данные о прибытии/отправлении в каждом аэропорту и преобразовать их в список словарей (пары Ключ /значение), что-то похожее на это :
Данные о полете.Аэропорты.BCN.Прибытие
[
{"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?
Комментарии:
1.
["flight": BIO, "passengers": 10]
недопустим JavaScript.[]
это для массивов, только у объектов естьkey:value
пары. Вы хотите, чтобы там был массив объектов?2. Вам нужно использовать
arrivals[k].time
в качестве ключа результат.3. Похоже, вам нужны результаты, даже если в соответствующем массиве нет данных (0:00: []), поэтому массив, который вы сопоставляете, вероятно, должен быть массивом раз, для которого вы затем обращаетесь к данным, чтобы извлечь данные.
4. И ваш пример результата-это не объект, а массив объектов. Было бы более разумно, если бы это был единый объект с временами в качестве ключей (что и создает ваш код).
5. @Appy Хорошая новость заключается в том, что ваш код действительно создает массив объектов.
Ответ №1:
Поскольку 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)
Комментарии:
1. Это отличное решение! спасибо, это отличное обучение
Ответ №2:
Есть несколько способов сделать это, если вы не возражаете начать с множества раз, рассмотрите этот подход:
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);
Комментарии:
1. Спасибо @James! Это идеально подходит для моего случая использования! Ты спасаешь мне жизнь!