首页 > 解决方案 > 使用比较函数 js 进行排序

问题描述

我编写了以下比较函数来对对象数组进行排序。首先拥有以“Ro”开头的所有项目,并按其长度进一步分组。然后是所有以“Bo”开头的项目,这些项目也按它们的角度进一步分组,然后是其余的。

private mycompareFunction(a: T, b: T) {
    if(a.name.startsWith("Ro") && b.name.startsWith("Ro")) {
        return a.length - b.length;
    } else if(b.name.startsWith("Ro")) {
        return 1;
    } else if(a.name.startsWith("Bo") && b.name.startsWith("Bo")) {
        return a.degrees - b.degrees;
    } else if(!a.name.startsWith("Ro") && b.name.startsWith("Bo")) {
        return 1;
    }
    return 0;
}

我得到的结果是:

RO Ø80/125

博 Ø80/125, 15°

沼泽Ø80/125, 30°

博 Ø80/125, 45°

博 Ø80/125, 87°

Ro Ø80/125, 0,5m

Ro Ø80/125, 1,0m

Ro Ø80/125, 2,0m

格莱特

希布XXmm

我在这里做错了什么?

标签: javascriptsorting

解决方案


比较函数应该返回

  • 如果第一个元素应该先出现,则为负数
  • 如果第二个元素应该先出现,则为正数
  • 零,如果两个元素中的哪个先出现都无关紧要

您的函数没有考虑很多情况,例如,a以“Ro”开头而b没有。

这是我的做法:

private mycompareFunction(a: T, b: T) {
    if (a.name.startsWith("Ro")) {
        if (b.name.startsWith("Ro") {
            return a.length - b.length;
        } else {
            return -1;
        }
    } else if (a.name.startsWith("Bo") {
        if (b.name.startsWith("Ro") {
            return 1;
        } else if (b.name.startsWith("Bo") {
            return a.degrees - b.degrees;
        } else {
            return -1;
        }
    } else {
        if (b.name.startsWith("Ro") || b.name.startsWith("Bo") {
            return 1;
        } else {
            return 0;
        }
    }
}

推荐阅读