。我如何根据数组索引之一的真实值对数字列表中的数组进行排名

问题描述 投票:0回答:1

我正在尝试构建一个表格,允许我通过遍历数组并按设定索引处的数字值对所有所述数组进行排名,从而按棒球运动员的数值属性 (1 - 100) 对棒球运动员进行排名。例如,如果数组是 var arr = [John James, Getting Started Pitcher, 88] 并且 88 是代表速度的 1 - 100 之间的数字,那么如何设置一个循环来确定标记为速度的列在按下时的排名比如说 50 个不同数组的 arr[2],它们都在 [2] 索引处具有速度评级。下面的代码是我最接近的。我是否必须在数组内嵌套一个数组才能对这些属性进行排名?

https://www.theshow ratings.com/lists/bunting-bunt此链接指向一个网站,该网站大致具有按设定属性对玩家进行排名的相同功能。任何帮助表示赞赏

对于 (I = 0; I < arr.length; I++){ if (arr[2] == 99.....

javascript
1个回答
0
投票

根据您的描述,我假设您有一个二维数组,如下所示:

players = [
  ["Aaron Aaronson", "Position A", 90],
  ["Bob Butcher", "Position B", 80],
  ["Chris Carpenter", "Position C", 70],
];

默认的 JavaScript 排序行为是将每个值(在本例中为表的每一行)转换为字符串,并按 Unicode 代码点对它们进行排序。就您而言,这相当于按玩家名字的字母顺序对玩家进行排序。为了按第三列进行数字排序,您需要提供自定义比较函数。该函数应采用两个值:如果第一个值较小,则应返回负数;如果第一个值较小,则返回负数。如果第一个值较大,则应返回正数;如果两个值相等,则应返回零。

function compareSpeeds(a, b) {
  return a[2] - b[2]
}

// To sort your array of players:
players.sort(compareSpeeds)

如果您希望能够根据更多数字列进行排序,您可以定义一个函数来动态返回指定列的比较函数:

function cmpCol(col) {
  return (a, b) => (a[col] - b[col]);
}

// Sort by column 2
players.sort(cmpCol(2));

// Sort by column 3
players.sort(cmpCol(3));

cmpCol
返回的内部函数是一个箭头函数。不一定是这样;你可以这样做:

function cmpCol(col) {
  return function(a, b) {
    return a[col] - b[col]
  }
}

...但是有几个像这样堆叠的 return 语句可能会变得有点混乱并且难以阅读。

如果您有一个对象数组而不是二维数组,您的解决方案可能如下所示:

players = [
  {
    name: "Aaron Aaronson",
    role: "Position A",
    speed: 90,
    height: 1.73
  },
  {
    name: "Bob Butcher",
    role: "Position B",
    speed: 80,
    height: 1.78
  },
  {
    name: "Chris Carpenter",
    role: "Position C",
    speed: 70,
    height: 1.75
  }
];

function cmpField(field) {
  return (a, b) => (a[field] - b[field]);
}

// Sort by speed
players.sort(cmpField("speed"));

// Sort by height
players.sort(cmpField("height"));

请注意,

sort
方法会修改原始数组(即就地排序)。如果您想创建原始数组的新排序副本,可以使用
toSorted
,否则其工作方式完全相同:

sortedPlayers = players.toSorted(cmpField("speed"));
© www.soinside.com 2019 - 2024. All rights reserved.