当前位置:首页 > JavaScript

js实现排名

2026-04-06 22:27:11JavaScript

实现数组元素排名

使用JavaScript对数组元素进行排名,可以根据数值大小赋予名次。以下是一种常见方法:

function rankArray(arr) {
  // 创建副本避免修改原数组
  const sorted = [...arr].sort((a, b) => b - a);
  return arr.map((value) => sorted.indexOf(value) + 1);
}

// 示例
const scores = [85, 92, 78, 92, 88];
console.log(rankArray(scores)); // 输出 [3, 1, 5, 1, 2]

处理并列排名

当存在相同值时,通常需要处理并列排名。以下方法确保相同值获得相同名次:

function rankWithTies(arr) {
  const sorted = [...arr].sort((a, b) => b - a);
  const ranks = {};
  let currentRank = 1;

  sorted.forEach((value, index) => {
    if (!ranks[value]) {
      ranks[value] = currentRank;
    }
    currentRank = index + 1;
  });

  return arr.map(value => ranks[value]);
}

// 示例
const data = [90, 95, 95, 80, 85];
console.log(rankWithTies(data)); // 输出 [4, 1, 1, 5, 3]

对象数组按属性排名

对对象数组按特定属性进行排名:

function rankObjectArray(arr, prop) {
  const sorted = [...arr].sort((a, b) => b[prop] - a[prop]);
  const ranks = {};
  let currentRank = 1;

  sorted.forEach((item, index) => {
    if (!ranks[item[prop]]) {
      ranks[item[prop]] = currentRank;
    }
    currentRank = index + 1;
  });

  return arr.map(item => ({
    ...item,
    rank: ranks[item[prop]]
  }));
}

// 示例
const students = [
  { name: 'Alice', score: 85 },
  { name: 'Bob', score: 92 },
  { name: 'Charlie', score: 85 }
];
console.log(rankObjectArray(students, 'score'));
/* 输出:
[
  { name: 'Alice', score: 85, rank: 2 },
  { name: 'Bob', score: 92, rank: 1 },
  { name: 'Charlie', score: 85, rank: 2 }
]
*/

自定义排名规则

通过回调函数实现更灵活的排名逻辑:

js实现排名

function customRank(arr, compareFn, tieHandler) {
  const sorted = [...arr].sort(compareFn);
  const ranks = new Array(arr.length);
  let rank = 1;

  for (let i = 0; i < sorted.length; i++) {
    if (i > 0 && compareFn(sorted[i-1], sorted[i]) !== 0) {
      rank = i + 1;
    }
    ranks[sorted[i].originalIndex] = tieHandler 
      ? tieHandler(rank, i, sorted) 
      : rank;
  }

  return ranks;
}

// 示例:降序排列,处理并列时取平均排名
const numbers = [10, 20, 30, 20, 40];
const ranked = customRank(
  numbers.map((n, i) => ({ value: n, originalIndex: i })),
  (a, b) => b.value - a.value,
  (currentRank, index, array) => {
    const sameValues = array.filter(x => x.value === array[index].value);
    if (sameValues.length > 1) {
      return currentRank + (sameValues.length - 1) / 2;
    }
    return currentRank;
  }
);
console.log(ranked); // 输出 [4, 2.5, 2.5, 1]

这些方法涵盖了从简单到复杂的各种排名场景,可根据实际需求选择或组合使用。对于大型数据集,建议考虑算法效率优化。

标签: js
分享给朋友:

相关文章

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…

js 实现递归

js 实现递归

递归的基本概念 递归是指函数直接或间接调用自身的过程。在JavaScript中,递归通常用于解决可以分解为相似子问题的问题,如阶乘、斐波那契数列、树形结构遍历等。 递归的实现要点 基线条件(Base…