JavaScript: 按照每个对象中的数字属性对对象数组进行排序

22

我很难理解如何使用array.sort()方法,根据每个对象中的数字值对对象数组进行排序。实际上,我的场景如下:

var myarray = []
myarray.push({name: "alex", age: 8})
myarray.push({name: "ben", age: 57})
myarray.push({name: "dan", age: 32})

结果的初始顺序应该是“alex, ben, dan”。现在我想按年龄对这个数组进行排序,所以年龄最大的人首先出现在列表中。排序后的顺序应该是“ben, dan, alex”。怎样用最简单的方式实现这个目标?

4个回答

32

您可以像这样使用解构赋值.sort方法:

var myarray = []
myarray.push({name: "alex", age: 8})
myarray.push({name: "ben", age: 57})
myarray.push({name: "dan", age: 32});

var res = myarray.sort(({age:a}, {age:b}) => b-a);
console.log(res);

或者,如果您对解构不感到舒适,可以使用常规的点符号访问age属性:

var myarray = []
myarray.push({name: "alex", age: 8})
myarray.push({name: "ben", age: 57})
myarray.push({name: "dan", age: 32});

var res = myarray.sort((a, b) => b.age-a.age);
console.log(res);

.sort 方法的工作方式是由你从回调函数中返回的内容来定义的。如果你返回:
  • <= -1,那么 a 将排在 b 前面。
  • 0,则 ab 保持不变。
  • >= 1,那么 b 将排在 a 前面。
因此,通过计算两个年龄之间的差异,“自然”地给出了正确的值,以便正确排序数组。

1
这个输出是错误的 - 应该是问题中显示的 bendanalex - Jack Bashford
3
我认为析构函数对于新手来说增加了不必要的复杂性。使用 age => age.b - age.a 会使得代码更易读。 - Adrian Brand
@AdrianBrand 是的,我能看到。我已经添加了一个替代方案。 - Nick Parsons
1
额外说明:.sort() 方法有两个作用,它会改变原始数组使其按顺序排序,并且还会返回对原始数组的引用(现在已经排序)。在上面的例子中,myarray 也被排序了。如果您不想让 myarray 排序,您可以在排序之前制作一个浅拷贝:myarray.slice().sort(...) - Nick Parsons

20

9

谢谢大家。我通过使用这个选项解决了问题:

data.sort(function(a, b) { return b.score - a.score })

3
这是一个降序排列,例如9-8-7-6-5-4-3-2-1。如果要进行升序排列,可以使用a.score - b.score - Santosh
增加了一些开销,但您可以简单地通过以下方式reverse一个降序结果:data.sort(function(a, b) { return b.score - a.score }).reverse() - vogomatix
不必要地使用reverse()会增加复杂性,只需在减法中简单地交换ab - user1438038

5
myarray.sort((a,b) => b.age - a.age)

这是正确的答案,但没有人帮助解决OP对排序理解困难的问题。传递给sort函数的函数是比较函数,当比较数组的两个元素时,应该返回小于0,如果a在前面;如果它们相等,则返回0;如果b在前面,则返回大于0。

我在我的项目中使用这个默认比较器函数。

defaultCompare = (a, b) => (!a && !b ? 0 : !a ? -1 : !b ? 1 : a < b ? -1 : a > b ? 1 : 0);

作为undefined、null、NaN和其他假值可能会对你造成影响,所以请小心对待。

默认比较函数为:defaultCompare = (a, b) => (a??0 - b??0);,也许可以使用空值合并运算符。 - vogomatix
或逻辑OR: defaultCompare = (a, b) => (a||0 - b||0); - vogomatix
@vogomatix 这是我用于数字的排序函数,但上面的 defaultCompare 函数也适用于字符串、日期和数字。 - Adrian Brand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接