首页 > 解决方案 > 如何在排序比较函数中获取数组元素的索引?

问题描述

我正在看这个问题:

数组的sort方法可以接受一个参数,该参数是一个带有两个参数的比较函数——比如 x 和 y。如果 x 应该在 y 之前,该函数返回一个负整数,如果 x 和 y 无法区分,则返回零,如果 x 应该在 y 之后,则返回一个正整数。编写调用,使用箭头函数,排序:

  1. 按降序排列的正整数数组
  2. 随着年龄的增长,一群人
  3. 增加长度的字符串数组

这是我的代码:

const posIntByDcrOrd = [5,4,3,2,1]
const peopleIncAge = [10,15,20,25,30]
const strIncLength = ['a','ab','abc','abcd']

const compFunc = (x,y) => {
    let sumNeg = y - x
    let sumPos = y + x
    if(indexOf(x) < indexOf(y)) { console.log(sumNeg) }
    else if( indexOf(x) > indexOf(y)) { console.log(sumPos) }
    else { return 0 }
}

posIntByDcrOrd.sort(compFunc(5,4))

这段代码背后的想法是:如果你可以将数组的 x 和 y 元素的索引相加,你可以得到一个负整数,因为 x 将低于 y 并且 y 将高于 x ,这满足条件。但是当我尝试运行它时,我当然得到了一个参考错误。如何访问已排序数组中 x 和 y 的索引位置?我也对其他解决方案持开放态度。

PS:这些数组是为了简化思考过程而编造的。

标签: javascriptarrayssortingindexingindexof

解决方案


这个网站上有大量关于排序的问答。您的尝试似乎表明您还没有看到数字在 JavaScript 中通常是如何排序的。例如这个问答和许多其他的,提供了正确的方法来做到这一点。

对您的尝试的一些评论:

  • indexOf在 的回调中没有可用的sort。你不需要这些信息。只需从第一个值中减去第二个值即可获得递增(非递减)结果。在另一个意义上执行减法以获得下降(非增加)的结果。函数的内部sort将使用该返回值来执行排序算法。在该过程中,您不需要知道任何索引。

  • 关于人员的分配可能没有正确反映在您的示例数组中,因为现在它看起来与第一个输入(数字数组)相同。很可能是一组对象。例如:

    const peopleIncAge = [{name: "Helen", age: 20},
                          {name: "John", age: 15},
                          {name: "Anne", age: 30},
                          {name: "Clark", age: 25},
                          {name: "Joy", age: 10}]
    
  • 您的输入数组已经排序,因为它们需要输出。为了测试任何解决方案,最好将它们洗牌。

这三个练习中的每一个都需要一个不同的函数回调sort函数:

const positives = [1, 3, 5, 4, 2];
const people = [{name: "Helen", age: 20},
                {name: "John", age: 15},
                {name: "Anne", age: 30},
                {name: "Clark", age: 25},
                {name: "Joy", age: 10}];
const strings = ['abc', 'a', 'abcd', 'ab'];

console.log(positives.sort((x, y) =>  y - x));  // decreasing
console.log(people.sort((x, y) =>  x.age - y.age)); // increasing age
console.log(strings.sort((x, y) =>  x.length - y.length)); // increasing length


推荐阅读