如何按指定ID数组排序数组,优先展示指定ID元素并保留其余元素顺序?
解决方案
你的需求完全可以实现,原代码的问题在于用ids.indexOf(a.league.id)作为数组索引赋值时,相同ID的元素会覆盖之前的项,导致每个ID仅保留最后一个匹配元素,同时丢失了不匹配ID的元素。
正确的实现思路分三步:
- 将数组拆分为两组:一组是ID在
ids列表中的元素,另一组是不在列表中的元素 - 对第一组元素按照
ids的顺序排序,且保留同ID元素的原始相对顺序 - 将排序后的第一组与保持原始顺序的第二组拼接
具体代码如下:
const matches = [ {"league": {"id":6,"score": "score 1"}}, {"league": {"id":9,"score": "score 2"}}, {"league": {"id":12,"score": "score 3"}}, {"league": {"id":6,"score": "score 4"}}, {"league": {"id":12,"score": "score 5"}}, {"league": {"id":3,"score": "score 6"}}, {"league": {"id":83,"score": "score 7"}}, {"league": {"id":76,"score": "score 8"}} ]; const ids = [6,12,3]; // 创建ID到排序位置的映射,提升查找效率 const idPositionMap = new Map(ids.map((id, index) => [id, index])); // 拆分出需要优先排序的元素和剩余元素 const prioritizedItems = matches.filter(item => idPositionMap.has(item.league.id)); const remainingItems = matches.filter(item => !idPositionMap.has(item.league.id)); // 按ids顺序排序优先元素,同ID元素保留原始顺序(JS sort从ES2019开始为稳定排序) prioritizedItems.sort((a, b) => { return idPositionMap.get(a.league.id) - idPositionMap.get(b.league.id); }); // 合并最终结果 const result = [...prioritizedItems, ...remainingItems]; console.log(result);
运行后输出的结果顺序为:
- 所有ID为6的元素(原始顺序:score1、score4)
- 所有ID为12的元素(原始顺序:score3、score5)
- ID为3的元素(score6)
- 剩余元素(原始顺序:score2、score7、score8)
该方案既满足指定ID元素按顺序排列在前的要求,又保留了所有元素,同时剩余元素保持原始顺序。
内容的提问来源于stack exchange,提问作者Nll
相关产品推荐
相关产品推荐

