Обработка данных в JavaScript

#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! Это идеально подходит для моего случая использования! Ты спасаешь мне жизнь!