Javascript 对对象数组进行排序

Javascript 对对象数组进行排序,javascript,sorting,ecmascript-6,Javascript,Sorting,Ecmascript 6,这是对对象数组进行排序的正确方法吗 class Alarm{ constructor(data){ this.a = data.a; this.b = data.b; } } const a1 = new Alarm({a:4,b:1}); const a2 = new Alarm({a:1,b:4}); const a3 = new Alarm({a:2,b:3}); const a4 = new Alarm({a:3,b:2}); let

这是对对象数组进行排序的正确方法吗

class Alarm{
    constructor(data){
        this.a = data.a;
        this.b = data.b;
    }
}

const a1 = new Alarm({a:4,b:1});
const a2 = new Alarm({a:1,b:4});
const a3 = new Alarm({a:2,b:3});
const a4 = new Alarm({a:3,b:2});

let a = [a1,a2,a3,a4];

a.sort((x,y)=>x.a>y.a);

for(const i of a){
    console.log(i)
}

a.sort((x,y)=>x.b>y.b);

for(const i of a){
    console.log(i)
}
当我查看文档时:

相反,他们这样做似乎非常尴尬:

a.sort((x,y)=>
    {
        if(x.a>y.a) return 1;
        if(x.a<y.a) return -1;
        return 0;
    });
a.sort((x,y)=>
{
如果(x.a>y.a)返回1;

如果(x.a您可以使用差异进行排序

a.sort((x, y) => x.a - y.a);
取自

如果提供了
compareFunction
,则将根据比较函数的返回值对数组元素进行排序。如果a和b是两个要比较的元素,则:

  • 如果
    compareFunction(a,b)
    小于0,则将a排序到比b低的索引,即a排在第一位
  • 如果
    compareFunction(a,b)
    返回0,则保持a和b彼此不变,但根据所有不同的元素进行排序。注意:ECMAscript标准不保证这种行为,因此并非所有浏览器(如至少可追溯到2003年的Mozilla版本)都遵守这一点
  • 如果
    compareFunction(a,b)
    大于0,则将b排序为比a低的索引
  • compareFunction(a,b)
    当给定一对特定的元素a和b作为其两个参数时,必须始终返回相同的值。如果返回不一致的结果,则排序顺序未定义
类报警{
建造师(数据){
此.a=数据.a;
此.b=数据.b;
}
}
常数a1=新报警({a:4,b:1});
常数a2=新报警({a:1,b:4});
常数a3=新报警({a:2,b:3});
常数a4=新报警({a:3,b:2});
设a=[a1,a2,a3,a4];
a、 排序((x,y)=>x.a-y.a);

log(JSON.stringify(a,0,4))
您将希望
x.a-y.a
排序
应返回3个值。
1
大于,
0
不更改,
-1
小于。@Keith对于字符串值,我不确定
-
如何工作。对于数值,它会工作,但由于OP要求更好的方法,我想我们应该反对两者兼而有之situations@Rajesh与
相同,它将被强制为一个数字。这并不奇怪。这是比较器函数的工作方式。顺便问一下,你的问题是什么?排序lambda应该返回1、-1和0而不是布尔值,这有什么逻辑原因吗。我真的很奇怪。有其他方法吗在哪里可以返回布尔值?我不熟悉JS和ES6:)@Baz,因为它就是这样工作的。布尔值意味着什么?返回值需要指示第一个参数是在第二个参数之前还是之后,还是在同一个位置。排序需要知道一个值是等于、大于还是小于。布尔值并没有给出这一点。要理解为什么需要,一个好主意是看看它是如何工作的排序功能已经完成。寻找冒泡排序/快速排序等。Wiki很可能在这方面有很好的文档。太好了!太空船操作员:)