乐闻世界logo
搜索文章和话题

JS 如何按字符串属性值对对象数组进行排序

7 个月前提问
3 个月前修改
浏览次数85

6个答案

1
2
3
4
5
6

在 JavaScript 中,如果要根据对象数组中对象的字符串属性进行排序,通常可以使用 Array.prototype.sort() 方法。这是一个自定义排序的方法,可以根据返回值来决定数组的顺序。

以下是按照对象的字符串属性对数组进行排序的具体步骤及例子:

  1. 定义一个比较函数,该函数接受两个参数,即要比较的两个对象。
  2. 在比较函数中,根据对象的字符串属性来比较它们的顺序。
  3. 使用字符串的 localeCompare 方法来实现不区分大小写的排序,或者直接使用 <> 操作符来实现区分大小写的排序。
  4. 调用数组的 sort 方法,并将比较函数作为参数传递。

以下是一个例子,假设我们有一个学生对象数组,并且希望根据学生的姓名(name属性)来对数组进行排序。

javascript
// 学生对象数组 let students = [ { id: 1, name: "张三" }, { id: 2, name: "李四" }, { id: 3, name: "王五" } ]; // 比较函数 function compareByName(a, b) { // 使用 localeCompare 进行不区分大小写的字符串比较 return a.name.localeCompare(b.name); } // 根据姓名排序 students.sort(compareByName); // 输出排序后的数组 console.log(students);

如果要求区分大小写的排序:

javascript
function compareByNameCaseSensitive(a, b) { if (a.name < b.name) { return -1; } if (a.name > b.name) { return 1; } return 0; } students.sort(compareByNameCaseSensitive);

以上代码将会根据学生姓名的字典顺序对 students 数组进行排序。如果需要其他方式的排序(例如倒序或者根据其他属性排序),只需要调整比较函数 compareByName 的逻辑即可。

2024年6月29日 12:07 回复

编写自己的比较函数很容易:

shell
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 );

或内联(c/o Marco Demaio):

shell
objs.sort((a,b) => (a.last_nom > b.last_nom) ? 1 : ((b.last_nom > a.last_nom) ? -1 : 0))

或者简化为数字(c/o Andre Figueiredo):

shell
objs.sort((a,b) => a.last_nom - b.last_nom); // b - a for reverse sort
2024年6月29日 12:07 回复

您还可以创建一个动态排序函数,根据您传递的值对对象进行排序:

shell
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; } }

所以你可以有一个像这样的对象数组:

shell
var People = [ {Name: "Name", Surname: "Surname"}, {Name:"AAA", Surname:"ZZZ"}, {Name: "Name", Surname: "AAA"} ];

...当你这样做时它就会起作用:

shell
People.sort(dynamicSort("Name")); People.sort(dynamicSort("Surname")); People.sort(dynamicSort("-Surname"));

其实这已经回答了问题。写下面的部分是因为很多人联系我,抱怨它不能使用多个参数

多个参数

您可以使用下面的函数生成具有多个排序参数的排序函数。

shell
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; } }

这将使你能够做这样的事情:

shell
People.sort(dynamicSortMultiple("Name", "-Surname"));

子类化数组

对于我们当中能够使用 ES6 的幸运者来说,它允许扩展原生对象:

shell
class MyArray extends Array { sortBy(...args) { return this.sort(dynamicSortMultiple(...args)); } }

这将实现这一点:

shell
MyArray.from(People).sortBy("Name", "-Surname");
2024年6月29日 12:07 回复

ES6/ES2015或更高版本中你可以这样做:

shell
objs.sort((a, b) => a.last_nom.localeCompare(b.last_nom));

ES6/ES2015 之前

shell
objs.sort(function(a, b) { return a.last_nom.localeCompare(b.last_nom) });
2024年6月29日 12:07 回复

下划线.js

使用Underscore.js]。它很小而且很棒...

sortBy_.sortBy(list, iterator, [context]) 返回列表的排序副本,按通过迭代器运行每个值的结果按升序排列。迭代器也可以是要排序的属性的字符串名称(例如长度)。

shell
var objs = [ { first_nom: 'Lazslo',last_nom: 'Jamf' }, { first_nom: 'Pig', last_nom: 'Bodine' }, { first_nom: 'Pirate', last_nom: 'Prentice' } ]; var sortedObjs = _.sortBy(objs, 'first_nom');
2024年6月29日 12:07 回复

我在 TypeORM 文档和源代码中都找不到 OR 运算符的任何概念。它完全支持吗? 我正在尝试使用存储库执行基本搜索。

js
db.getRepository(MyModel).find({ name : "john", lastName: "doe" })

我知道这会生成 AND 运算,但我需要 OR 运算,因此 SQL 如下所示: name='john' OR lastName='doe' 我是否被迫使用查询生成器来完成这样的基本操作?

2024年6月29日 12:07 回复

你的答案