按照字符串属性值对对象数组进行排序
按照字符串属性值对对象数组进行排序
我有一个JavaScript对象的数组:
var objs = [ { first_nom: 'Lazslo', last_nom: 'Jamf' }, { first_nom: 'Pig', last_nom: 'Bodine' }, { first_nom: 'Pirate', last_nom: 'Prentice' } ];
如何在JavaScript中按照last_nom
的值对它们进行排序?
我知道有sort(a,b)
,但那似乎只适用于字符串和数字。我需要为我的对象添加一个toString()
方法吗?
admin 更改状态以发布 2023年5月20日
您还可以创建一个动态排序函数,通过传递值来对对象进行排序:
function dynamicSort(property) { var sortOrder = 1; if(property[0] === "-") { sortOrder = -1; property = property.substr(1); } return function (a,b) { /* next line works with strings and numbers, * and you may want to customize it to your needs */ var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0; return result * sortOrder; } }
因此,您可以有这样一个对象数组:
var People = [ {Name: "Name", Surname: "Surname"}, {Name:"AAA", Surname:"ZZZ"}, {Name: "Name", Surname: "AAA"} ];
...并且当您执行以下操作时,它将起作用:
People.sort(dynamicSort("Name")); People.sort(dynamicSort("Surname")); People.sort(dynamicSort("-Surname"));
实际上,这已经回答了问题。下面的部分是因为许多人联系我,抱怨它不能处理多个参数。
多个参数
您可以使用下面的函数生成具有多个排序参数的排序函数。
function dynamicSortMultiple() { /* * save the arguments object as it will be overwritten * note that arguments object is an array-like object * consisting of the names of the properties to sort by */ var props = arguments; return function (obj1, obj2) { var i = 0, result = 0, numberOfProperties = props.length; /* try getting a different result from 0 (equal) * as long as we have extra properties to compare */ while(result === 0 && i < numberOfProperties) { result = dynamicSort(props[i])(obj1, obj2); i++; } return result; } }
这将使您能够执行以下操作:
People.sort(dynamicSortMultiple("Name", "-Surname"));
子类化数组
对于我们中的幸运儿,可以使用允许扩展本机对象的ES6:
class MyArray extends Array { sortBy(...args) { return this.sort(dynamicSortMultiple(...args)); } }
这将使您能够执行以下操作:
MyArray.from(People).sortBy("Name", "-Surname");
编写自己的比较函数非常容易:
function compare( a, b ) { if ( a.last_nom < b.last_nom ){ return -1; } if ( a.last_nom > b.last_nom ){ return 1; } return 0; } objs.sort( compare );
或者内联方式(由Marco Demaio提供):
objs.sort((a,b) => (a.last_nom > b.last_nom) ? 1 : ((b.last_nom > a.last_nom) ? -1 : 0))
或者对于数字进行简化(由Andre Figueiredo提供):
objs.sort((a,b) => a.last_nom - b.last_nom); // b - a for reverse sort