JS sort()对嵌套对象排序未达预期,求正确实现方法
按嵌套对象的value属性排序数组
原数组:
const arr = [ { 0: "id1", 1: { title: "object1", value: 200 } }, { 0: "id2", 1: { title: "object2", value: 100 } }, { 0: "id3", 1: { title: "object3", value: 300 } }, ]
期望的升序排序结果:
const sortedArr = [ { 0: "id2", 1: { title: "object2", value: 100 } }, { 0: "id1", 1: { title: "object1", value: 200 } }, { 0: "id3", 1: { title: "object3", value: 300 } }, ]
你尝试的错误代码:
const sortedArr = arr.sort((a, b) => { if (a[1].value - b[1].value) { return -1 } else { return 1 } })
问题原因
你写的排序回调逻辑错误:只要a[1].value - b[1].value的结果不为0(不管是正数还是负数),就返回-1,这会完全打乱排序的比较逻辑。Array.sort()的回调函数需要根据元素大小返回对应数值:
- 返回负数:
a排在b前面 - 返回正数:
a排在b后面 - 返回0:
a和b位置不变
正确解法
要实现升序排序,直接返回两个value的差值即可:
// 升序排序(从小到大) const sortedArr = [...arr].sort((a, b) => a[1].value - b[1].value);
如果需要降序排序,反转差值顺序:
// 降序排序(从大到小) const sortedArr = [...arr].sort((a, b) => b[1].value - a[1].value);
注意:
Array.sort()会原地修改原数组,若不想改变原数组,建议先用扩展运算符[...arr]或arr.slice()复制新数组再排序。
内容的提问来源于stack exchange,提问作者Piotr
相关产品推荐
相关产品推荐

