当前位置:首页 > JavaScript

js实现排名

2026-02-02 05:12:12JavaScript

实现数组元素排名

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

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]

处理并列排名

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

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实现轮播图

js实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div c…

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('image…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js防抖和节流实现

js防抖和节流实现

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