如何根据另一个数组的值对JavaScript对象数组进行排序?
根据指定数组排序对象数组的解决方案
针对你需要按照newIndexes数组的顺序对driverArray排序的需求,可以用以下高效的方法实现:
核心思路
先将driverArray转换为以pos值为键的映射结构,这样就能通过newIndexes中的元素快速找到对应的对象,再按顺序生成排序后的数组。这种方法的时间复杂度为O(n),比你提供的纯数组示例中的O(n²)方法更高效。
代码实现
const driverArray = [ {label: "Driver 1", pos: 1}, {label: "Driver 2", pos: 2}, {label: "Driver 3", pos: 3}, {label: "Driver 4", pos: 4}, {label: "Driver 5", pos: 5}, {label: "Driver 6", pos: 6}, {label: "Driver 7", pos: 7}, {label: "Driver 8", pos: 8}, {label: "Driver 9", pos: 9}, {label: "Driver 10", pos:10} ]; const newIndexes = [1,2,3,7,4,8,5,9,6,10]; // 1. 创建pos到driver对象的Map映射 const driverMap = new Map(driverArray.map(driver => [driver.pos, driver])); // 2. 根据newIndexes的顺序生成排序后的数组 const sortedDrivers = newIndexes.map(pos => driverMap.get(pos)); // 验证结果 sortedDrivers.forEach(driver => console.log(driver.label)); // 输出顺序:Driver 1, Driver 2, Driver 3, Driver 7, Driver 4, Driver 8, Driver 5, Driver 9, Driver 6, Driver 10
替代方案(使用普通对象)
如果不想使用Map,也可以用普通对象来实现映射:
// 创建pos到driver对象的普通对象映射 const driverObj = {}; driverArray.forEach(driver => { driverObj[driver.pos] = driver; }); // 生成排序后的数组 const sortedDrivers = newIndexes.map(pos => driverObj[pos]);
为什么这个方法更优
你提供的纯数组示例中,每次遍历sorting数组都要对items进行一次filter操作,相当于嵌套循环,数据量大时性能会下降。而映射查找的方式只需要遍历两次数组(一次构建映射,一次生成结果),整体效率更高,代码也更简洁。
内容的提问来源于stack exchange,提问作者Powl_London
相关产品推荐
相关产品推荐

