当前位置:首页 > JavaScript

js实现排名

2026-02-02 05:12:12JavaScript

实现数组元素排名

在JavaScript中,可以通过排序和映射的方式为数组元素生成排名。以下是一个常见的实现方法:

js实现排名

function rankArray(arr) {
  // 创建带有原始索引的副本
  const indexedArr = arr.map((value, index) => ({value, index}));

  // 按值降序排序
  indexedArr.sort((a, b) => b.value - a.value);

  // 分配排名
  const ranks = new Array(arr.length);
  indexedArr.forEach((item, i) => {
    ranks[item.index] = i + 1; // 排名从1开始
  });

  return ranks;
}

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

处理并列排名

对于有相同值的元素,通常需要相同的排名,可以使用以下方法处理并列情况:

js实现排名

function rankArrayWithTies(arr) {
  const indexedArr = arr.map((value, index) => ({value, index}));
  indexedArr.sort((a, b) => b.value - a.value);

  const ranks = new Array(arr.length);
  let currentRank = 1;

  for (let i = 0; i < indexedArr.length; i++) {
    if (i > 0 && indexedArr[i].value !== indexedArr[i-1].value) {
      currentRank = i + 1;
    }
    ranks[indexedArr[i].index] = currentRank;
  }

  return ranks;
}

// 示例用法
const scores = [85, 92, 78, 92, 88];
const rankings = rankArrayWithTies(scores);
console.log(rankings); // 输出: [3, 1, 5, 1, 4]

复杂对象的排名

当需要基于对象属性进行排名时,可以这样实现:

function rankByProperty(arr, prop) {
  const indexedArr = arr.map((item, index) => ({
    value: item[prop],
    index,
    original: item
  }));

  indexedArr.sort((a, b) => b.value - a.value);

  const ranked = [];
  let currentRank = 1;

  indexedArr.forEach((item, i) => {
    if (i > 0 && item.value !== indexedArr[i-1].value) {
      currentRank = i + 1;
    }
    ranked.push({
      ...item.original,
      rank: currentRank
    });
  });

  return ranked;
}

// 示例用法
const students = [
  {name: 'Alice', score: 85},
  {name: 'Bob', score: 92},
  {name: 'Charlie', score: 78},
  {name: 'David', score: 92},
  {name: 'Eve', score: 88}
];

const rankedStudents = rankByProperty(students, 'score');
console.log(rankedStudents);

分组排名

对于需要分组内进行排名的情况,可以使用以下方法:

function groupRank(data, groupKey, rankKey) {
  const groups = {};

  // 按组分类
  data.forEach(item => {
    const group = item[groupKey];
    if (!groups[group]) groups[group] = [];
    groups[group].push(item);
  });

  // 每组内排名
  Object.values(groups).forEach(group => {
    group.sort((a, b) => b[rankKey] - a[rankKey]);
    let currentRank = 1;
    group.forEach((item, i) => {
      if (i > 0 && item[rankKey] !== group[i-1][rankKey]) {
        currentRank = i + 1;
      }
      item.rank = currentRank;
    });
  });

  return data;
}

// 示例用法
const salesData = [
  {region: 'North', salesperson: 'John', sales: 150},
  {region: 'North', salesperson: 'Jane', sales: 200},
  {region: 'South', salesperson: 'Mike', sales: 180},
  {region: 'South', salesperson: 'Sarah', sales: 220},
  {region: 'North', salesperson: 'Tom', sales: 200}
];

const rankedSales = groupRank(salesData, 'region', 'sales');
console.log(rankedSales);

标签: js
分享给朋友:

相关文章

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现延迟

js实现延迟

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

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js 实现滚动

js 实现滚动

实现滚动的方法 使用 window.scrollTo() window.scrollTo() 方法可以滚动到文档中的特定位置。可以指定 x 和 y 坐标,或者使用平滑滚动的选项。 // 滚动到指定位…

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…

js 实现跳转

js 实现跳转

使用 window.location.href 进行跳转 通过修改 window.location.href 可以跳转到指定 URL,浏览器会加载新页面: window.location.hre…