首页 > 解决方案 > 如何嵌套具有重复值的数组中的对象

问题描述

我有一系列用于公共汽车到达的对象。该数组具有具有重复属性但时间不同的对象。我想将后到的总线嵌套到先到的总线中。该数组也按到达时间排序。

[ 
   { 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 }
      ]
   }
]

标签: javascriptarraysobject

解决方案


您可以将数组减少为一个值(一个Map),然后将该映射的值作为新数组传播:

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(),
]);


推荐阅读