按对象属性值对数组进行数字排序

131

如何按照distance将这个包含对象的数组排序,以便将对象从最小距离排到最大距离?

[
  { distance: 3388, duration: "6 mins", from: "Lenchen Ave, Centurion 0046, South Africa" },
  { distance: 13564, duration: "12 mins", from: "Lenchen Ave, Centurion 0046, South Africa" },
  { distance: 4046, duration: "6 mins", from: "Lenchen Ave, Centurion 0046, South Africa" },
  { distance: 11970, duration: "17 mins", from: "Lenchen Ave, Centurion 0046, South Africa" }
]

3
按属性进行数字排序的模式是 myarray.sort((a, b) => a.distance - b.distance)。要按字典顺序排序,请使用 a.from.localeCompare(b.from)。要按降序而不是升序排序,请取反返回值(例如,b.distance - a.distance 而不是 a.distance - b.distance)。要按数字字符串排序,可以选择使用 Number。要按多个属性排序,请使用 || 链接其他排序,例如 b.someNumber - a.someNumber || a.someString.localeCompare(b.someString) - Sebastian Simon
10个回答

251

使用Array.prototype.sort()方法,例如:

myArray.sort((a, b) => a.distance - b.distance)
sort()方法接受一个比较函数。该函数接受两个参数(都应该是相同类型),其工作是确定哪个参数先出现。

它通过返回一个整数来实现这一点

  • 负数(小于零):第一个参数先出现
  • 正数(大于零):第二个参数先出现
  • 零:将参数视为相等以进行排序

当您处理数字值时,最简单的解决方案是从第二个值中减去第一个值,这将产生升序结果。


1
另一种方法是使用解构赋值:myArray.sort(({ distance: a }, { distance: b }) => a - b); - Sebastian Simon
4
@SebastianSimon 这不太像是一种“替代方案”,更像是在语法上多了10个字符的相同事物。土豆/西红柿。 - Phil

77

下面是一个带有被接受答案的示例:

 a = [{name:"alex"},{name:"clex"},{name:"blex"}];

升序排列:

a.sort((a,b)=> (a.name > b.name ? 1 : -1))

输出:[{name: "clex"}, {name: "blex"}, {name: "alex"}]

降序排列:

a.sort((a,b)=> (a.name < b.name ? 1 : -1))

输出:[{name: "clex" }, {name: "blex"}, {name: "alex"}]


除此之外,不要忘记在比较函数中将数据更改为大写或小写,这样您就可以获得按字母顺序排列的结果,而不受ASCII代码的影响。 - Akash

26

以下是与当前最佳答案相同的ES6一行代码:

myArray.sort((a, b) => a.distance - b.distance);


8
这对我有用。
var files=data.Contents;
          files = files.sort(function(a,b){
        return a.LastModified - b. LastModified;
      });

使用 Lodash 进行数组排序。
files = _.orderBy(files,'LastModified','asc');

“LastModified” 是从哪里来的?目标属性是 “distance”。 - Sebastian Simon
"LastModified" 是对象中的关键字。在我的情况下,它是日期。 - Vinod Poorma

6

与已经给出的答案没有太大的区别,但更为通用的是:

sortArrayOfObjects = (arr, key) => {
    return arr.sort((a, b) => {
        return a[key] - b[key];
    });
};

sortArrayOfObjects(yourArray, "distance");

1
可以使用一行代码的返回语句编写:sortArrayOfObjects = (arr, key) => { return arr.sort((a, b) => a[key] - b[key]); }; - user10971804

4

将数组myArray中的所有对象推送,然后使用此方法进行排序。

myArray.sort(function(a, b) {
    return a.distance - b.distance;
});

4

如果你有大小写不一样的名称,请使用 toLowerCase() 函数。
以下是一个例子:

data = [{name:"foo"},{name:"Bar"},{name:"Foo"}];


a.sort((a,b)=> (a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1))

1
你可以使用柯里化来实现这个功能:
const arr = [
  { distance: 3388, duration: 6},
  { distance: 13564, duration: 12},
  { distance: 4046, duration: 6 },
  { distance: 11970, duration: 17 }
]

const sortByKey = (key) => (a, b) => b[key] - a[key];

const sortByDistance = sortByKey("distance");
const sortByDuration = sortByKey("duration");

console.log(arr.sort(sortByDistance))
console.log(arr.sort(sortByDuration))

0

这里有另一个一行代码给你:

your_array.sort((a, b) => a.distance === b.distance ? 0 : a.distance > b.distance || -1);

0

ES6 箭头函数:

const orderArrayBy = (arr, key) => arr.sort((a, b) => a[key] - b[key]);

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