Как я могу вкладывать объекты из массива с повторяющимися значениями - PullRequest
0 голосов
/ 17 января 2019

У меня есть массив объектов для прибытия автобусов. Массив имеет объекты, которые имеют повторяющиеся свойства, но разное время. Я хотел бы вложить автобусы, которые приходят позже, в автобус, который идет первым. Также массив упорядочен по времени прибытия.

[ 
   { Arrival, busId: "123", minToStop: 16, timeToStop: 957 },
   { Arrival, busId: "123", minToStop: 23, timeToStop: 1390 } 
]

Есть ли какой-нибудь хороший и простой способ сделать это в JavaScript?

Это то, что я хочу получить

[ 
   { Arrival, busId: "123", minToStop: 16, timeToStop: 957, laterBuses: 
      [
         { Arrival, busId: "123", minToStop: 23, timeToStop: 1390 },
         { Arrival, busId: "123", minToStop: 30, timeToStop: 1820 }
      ]
   }
]

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Вы можете уменьшить массив до одного значения ( Карта ), а затем распространить значения этой карты как новый массив:

const busses = [
  { busId: '234', minToStop: 40, timeToStop: 1390 },
  { busId: '123', minToStop: 16, timeToStop: 957 },
  { busId: '123', minToStop: 23, timeToStop: 1490 },
  { busId: '234', minToStop: 17, timeToStop: 957 },
  { busId: '123', minToStop: 40, timeToStop: 1390 },
  { busId: '123', minToStop: 30, timeToStop: 1390 },
  { busId: '234', minToStop: 1, timeToStop: 1490 },
];
console.log([
  ...busses
    .sort((a, b) => a.minToStop - b.minToStop)
    .reduce((result, bus) => {
      const parentBus = result.get(bus.busId);
      const current = parentBus || {
        ...bus,
        laterBusses: [],
      };
      if (!!parentBus) {
        //only add to laterbusses if it's not the first bus found
        current.laterBusses.push(bus);
      }
      return result.set(current.busId, current);
    }, new Map())
    .values(),
]);
0 голосов
/ 17 января 2019

Это решение сначала отсортирует шины по minToStop, а затем по busId.Затем он перебирает массив buses и условно помещает шину на верхний уровень массива final или вкладывает, как вы просили.

const buses = [ 
   { busId: "234", minToStop: 40, timeToStop: 1390 },
   { busId: "123", minToStop: 16, timeToStop: 957 },
   { busId: "123", minToStop: 23, timeToStop: 1490 },
   { busId: "234", minToStop: 17, timeToStop: 957 },
   { busId: "123", minToStop: 30, timeToStop: 1390 },
   { busId: "234", minToStop: 1, timeToStop: 1490 } 
];

buses.sort((a,b) => a.minToStop - b.minToStop);
buses.sort((a,b) => a.busId > b.busId);

let formatted = [];

buses.forEach(bus => {
  if (
    formatted.length > 0 && 
    formatted[formatted.length - 1].busId === bus.busId
  ) {
    formatted[formatted.length - 1].laterBuses.push(bus);
  } else {
    bus.laterBuses = [];
    formatted.push(bus);
  }
});

console.log(formatted);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...