javascript - 如何嵌套具有重复值的数组中的对象
问题描述
我有一系列用于公共汽车到达的对象。该数组具有具有重复属性但时间不同的对象。我想将后到的总线嵌套到先到的总线中。该数组也按到达时间排序。
[
{ 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 }
]
}
]
解决方案
您可以将数组减少为一个值(一个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(),
]);
推荐阅读
- android - 约束布局和滚动视图不起作用
- java - 我有一个 Selenium 脚本和 GUI。如果他们没有下载 Selenium,我如何与我的团队分享
- can-bus - 监控 CAN 报文
- vba - 访问:转到记录未正确找到记录
- javascript - 在使用 vanilla js 在 Dom 上显示元素后,通过单击窗口对象隐藏元素?
- java - 如何设置 EJB 传输的超时请求?
- azure - PWA 仅使用 JS 为 Azure 通知中心注册推送通知
- python-3.x - 如何测量脸的大小?
- linux - apt-get install upgrade 在kali linux上不起作用
- jsf-2 - h:selectItems itemLabel 逃脱女巫是不需要的