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

Mir*_*une 5 javascript arrays sorting

我很难理解如何使用 array.sort() 方法根据在每个对象中找到的数值对对象数组进行排序。基本上我有以下形式的场景:

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

结果的初始顺序是“alex, ben, dan”。现在我想按年龄对这个数组进行排序,所以最年长的人排在第一位。排序后的顺序应该是“ben, dan, alex”。我如何以最简单的方式实现这一目标?

Nic*_*ons 10

您可以使用解构赋值和如下.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);
Run Code Online (Sandbox Code Playgroud)

或者,如果您对析构不满意,您可以使用常规点符号来访问该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);
Run Code Online (Sandbox Code Playgroud)

.sort工作方式由您从传入的回调函数返回的内容定义。如果您返回:

  • <= -1然后a会来之前b
  • 0然后保持ab在相同的位置
  • >= 1然后b会在之前a

因此,通过计算两个年龄之间的差异,这“自然地”给出了正确的值来正确地对数组进行排序。

  • 我认为破坏给新手增加了不必要的复杂性。age =&gt;age.b -age.a 使其更易于阅读。 (3认同)

Mir*_*une 9

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

data.sort(function(a, b) { return b.score - a.score })
Run Code Online (Sandbox Code Playgroud)

  • 这是降序排列的。像 9-8-7-6-5-4-3-2-1 一样,我们可以使用升序。`a.score - b.score` (3认同)

G_c*_*onn 5

ES6

myarray.sort((a,b) => b.age - a.age)
Run Code Online (Sandbox Code Playgroud)

ES5

myarray.sort(function(a,b){return b.age - a.age})
Run Code Online (Sandbox Code Playgroud)

排序功能的详细描述可以在这里找到 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

*编辑为按照 OP 要求按降序排序


Adr*_*and 5

myarray.sort((a,b) => b.age - a.age)
Run Code Online (Sandbox Code Playgroud)

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

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

defaultCompare = (a, b) => (!a && !b ? 0 : !a ? -1 : !b ? 1 : a < b ? -1 : a > b ? 1 : 0);
Run Code Online (Sandbox Code Playgroud)

因为未定义、null、NaN 和其他错误值可能会给你带来麻烦。