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

IT技术 javascript arrays sorting comparison
2020-12-27 22:24:44

我有一组 JavaScript 对象:

var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];

如何按last_nomJavaScript 中的值对它们进行排序

我知道sort(a,b),但这似乎只适用于字符串和数字。我需要toString()为我的对象添加一个方法吗?

6个回答

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

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))
return a.last_nom.localeCompare(b.last_nom) 也会起作用。
2021-02-16 22:24:44
请写短代码 objs.sort((a, b) => a.last_nom > b.last_nom && 1 || -1)
2021-02-17 22:24:44
对于那些寻找字段为数字的排序的人,比较函数体:return a.value - b.value;(ASC)
2021-02-23 22:24:44
或内联: objs.sort(function(a,b) {return (a.last_nom > b.last_nom) ? 1 : ((b.last_nom > a.last_nom) ? -1 : 0);} );
2021-03-06 22:24:44

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

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");
好的。现在有这个答案的typescript版本:stackoverflow.com/a/68279093/8910547保持(类型)安全!😉
2021-02-11 22:24:44

在 ES6/ES2015 或更高版本中,您可以这样做:

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

在 ES6/ES2015 之前

objs.sort(function(a, b) {
    return a.last_nom.localeCompare(b.last_nom)
});
如果值是数字,则不需要localeCompare. 您可以使用标准>运算符 - 就像@muasif80 在回答中提到的那样 - stackoverflow.com/a/67992215/6908282
2021-02-12 22:24:44
这从 JS 1.1 开始就可用了,这里的箭头部分是 ES6/2015 部分。但仍然非常有用,在我看来最好的答案
2021-03-03 22:24:44
@PratikKelwalkar:如果您需要反转它,只需切换 a 和 b 比较: objs.sort((a, b) => b.last_nom.localeCompare(a.last_nom));
2021-03-05 22:24:44

下划线.js

使用下划线,它的小而真棒......

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

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' );
在 lodash 中,这将是相同的:var sortedObjs = _.sortBy( objs, 'first_nom' );或者如果您想要以不同的顺序:var sortedObjs = _.orderBy( objs, ['first_nom'],['dsc'] );
2021-02-08 22:24:44
反向排序: var reverseSortedObjs = _.sortBy( objs, 'first_nom' ).reverse();
2021-02-15 22:24:44
您需要加载 javascript 库“下划线”: <script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"> </script>
2021-02-15 22:24:44
也可Lodash用于那些喜欢那个的人
2021-02-17 22:24:44
大卫,你能编辑答案说,var sortedObjs = _.sortBy( objs, 'first_nom' );objs不会因此自行排序。该函数将返回一个排序的数组。这将使其更加明确。
2021-02-25 22:24:44

如果您有重复的姓氏,您可以按名字对它们进行排序-

obj.sort(function(a,b){
  if(a.last_nom< b.last_nom) return -1;
  if(a.last_nom >b.last_nom) return 1;
  if(a.first_nom< b.first_nom) return -1;
  if(a.first_nom >b.first_nom) return 1;
  return 0;
});
@BadFeelingAboutThis 返回 -1 或 1 是什么意思?我明白 -1 字面意思是 A 小于 B 只是语法,但为什么使用 1 或 -1?我看到每个人都使用这些数字作为返回值,但为什么呢?谢谢。
2021-02-08 22:24:44
@BadFeelingAboutThis 感谢您的解释和链接。信不信由你,1, 0, -1在我在这里问这个之前,我使用 google 搜索了各种代码片段我只是没有找到我需要的信息。
2021-02-23 22:24:44
@Chris22 返回的负数意味着b应该a在数组之后。如果返回正数,则表示a应该在 之后b如果0返回,则表示它们被视为相等。您可以随时阅读文档:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-04 22:24:44