如何依据指定对象数组的顺序对目标数据数组进行自定义排序?
数组按指定参考顺序排序实现方案
最优实现代码
推荐先把参考顺序映射为权重字典,排序时直接读取权重比较即可:
// 生成参考索引的权重映射,O(1)即可读取对应排序优先级 const orderMap = new Map(filter.map((item, idx) => [item.index, idx])) // 按权重排序得到结果 const sortedData = data.sort((a, b) => orderMap.get(a.index) - orderMap.get(b.index))
运行后sortedData就是你需要的预期结果。
问题解答
问题1:如何正确遍历两个数组实现上述排序需求?
如果非要在排序过程中直接遍历参考数组,可以在sort的比较函数中用findIndex查找两个元素对应的参考位置再比较:const sortedData = data.sort((a, b) => { const aOrder = filter.findIndex(item => item.index === a.index) const bOrder = filter.findIndex(item => item.index === b.index) return aOrder - bOrder })这种方案可以实现需求,但性能较差。
问题2:是否必须遍历两个数组才能实现?有没有其他更高效的方案可以得到预期结果?
不需要在排序过程中反复遍历参考数组,上述先做权重映射的方案性能更高:
总时间复杂度为O(m + nlogn)(m为参考数组长度,n为业务数据长度),远高于直接遍历双数组方案的O(m*nlogn),数据量越大性能优势越明显。问题3:当前参考排序的索引为三个,如果后续索引数量增加,方案是否可以兼容?
两种方案都可以兼容新增索引,不需要修改排序逻辑。如果使用权重映射方案,只要参考数组filter中新增了对应的索引配置,重新生成一次orderMap即可适配新的排序规则,不需要改动其他代码。
内容的提问来源于stack exchange,提问作者trickysneak
相关产品推荐
相关产品推荐

