如何过滤对象数组并按自定义优先级排序(支持顺序调整)
解决数组过滤+自定义排序的简便方案
这个需求其实很常见,咱们可以用自定义优先级映射的方式来实现,既灵活又好维护,完全不用依赖字符串排序,以后调整顺序或者新增格式也超方便!
实现思路
- 先定义一个优先级对象,把你需要保留的格式和对应的排序权重写进去——数字越小,排序越靠前
- 先过滤数组,只保留在优先级对象里的格式
- 再根据优先级对象的权重对过滤后的数组排序
代码示例
首先是你的原始数组:
const originalFiles = [ { "id": "4", "fileName": "fileXX", "format": "mp3" }, { "id": "5", "fileName": "fileXY", "format": "aac" }, { "id": "6", "fileName": "fileXZ", "format": "opus" } ];
然后定义咱们的优先级规则(这里可以随意调整顺序,新增格式也只需要加键值对):
const formatPriority = { 'aac': 1, // 排第1位 'mp3': 2 // 排第2位 };
接下来就是核心的处理逻辑:
const result = originalFiles // 第一步:过滤出我们需要保留的格式 .filter(file => formatPriority.hasOwnProperty(file.format)) // 第二步:按照自定义优先级排序 .sort((fileA, fileB) => formatPriority[fileA.format] - formatPriority[fileB.format]);
运行后得到的结果就是你要的:
console.log(result); // 输出: // [ // { "id": "5", "fileName": "fileXY", "format": "aac" }, // { "id": "4", "fileName": "fileXX", "format": "mp3" } // ]
为什么这个方案好用?
- 灵活性拉满:以后要调整排序顺序(比如把mp3放到aac前面),或者新增需要保留的格式(比如加
'flac': 0让它排最前面),只需要修改formatPriority对象就行,不用动过滤和排序的核心代码 - 性能更优:先过滤再排序,减少了排序时需要处理的元素数量,数组越大,这个优势越明显
- 彻底摆脱字符串排序:不管格式名称是什么,都能严格按照你自定义的规则排序,完全不会出现字母排序带来的意外问题
内容的提问来源于stack exchange,提问作者Helmi
相关产品推荐
相关产品推荐

