JavaScript如何按指定键排序对象数组并移除最高值类元素
按指定字段分组排序并排除前N类数据的实现
需求说明
给定存储项目对象的数组,每个对象包含project_name字段,需要实现以下逻辑:
- 数组内所有对象按
project_name字段值从高到低排序 - 支持配置参数N,排除排序后
project_name值最高的前N个分类的全部数据,返回剩余数据集
示例规则:N=1时,排除值最高的C类所有条目,返回B、A类排序后的结果
原始输入数据
const sourceList = [ { "project_name": "A", "key1": "value1" }, { "project_name": "B", "key1": "value1" }, { "project_name": "B", "key1": "value1" }, { "project_name": "B", "key1": "value1" }, { "project_name": "A", "key1": "value1" }, { "project_name": "C", "key1": "value1" } ]
实现代码
针对大数组场景做了性能适配,用Set结构做分类判断减少遍历开销:
/** * 处理项目数组排序、排除前N类数据 * @param {Array} list 原始数据源 * @param {number} excludeTopN 需要排除的最高分类数量,示例场景传1 * @returns {Array} 处理后的结果集 */ function processProjectList(list, excludeTopN = 0) { // 提取去重的project_name值,按降序排序 const sortedCategories = [...new Set(list.map(item => item.project_name))] .sort((a, b) => b.localeCompare(a)) // 字符串排序用localeCompare,如果project_name是数值类型,把排序逻辑替换为 b - a 即可 // 生成待排除分类的集合,判断时间复杂度O(1) const excludeSet = new Set(sortedCategories.slice(0, excludeTopN)) // 过滤待排除分类,剩余数据按project_name降序返回 return list .filter(item => !excludeSet.has(item.project_name)) .sort((a, b) => b.project_name.localeCompare(a.project_name)) } // 示例调用:排除排名最高的1类数据 const result = processProjectList(sourceList, 1)
输出结果
调用后返回结果和预期完全一致:
[ { "project_name": "B", "key1": "value1" }, { "project_name": "B", "key1": "value1" }, { "project_name": "B", "key1": "value1" }, { "project_name": "A", "key1": "value1" }, { "project_name": "A", "key1": "value1" } ]
内容的提问来源于stack exchange,提问作者Taha Yıldırım
相关产品推荐
相关产品推荐

