You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按指定ID数组排序数组,优先展示指定ID元素并保留其余元素顺序?

解决方案

你的需求完全可以实现,原代码的问题在于用ids.indexOf(a.league.id)作为数组索引赋值时,相同ID的元素会覆盖之前的项,导致每个ID仅保留最后一个匹配元素,同时丢失了不匹配ID的元素。

正确的实现思路分三步:

  1. 将数组拆分为两组:一组是ID在ids列表中的元素,另一组是不在列表中的元素
  2. 对第一组元素按照ids的顺序排序,且保留同ID元素的原始相对顺序
  3. 将排序后的第一组与保持原始顺序的第二组拼接

具体代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 10:13:20