根据对象的属性之一对对象的 JavaScript 数组进行排序

IT技术 javascript
2021-02-03 11:22:32

我有一个对象数组,每个对象都有一个属性name,一个字符串。我想按此属性对数组进行排序。我希望它们按以下方式排序..

`ABC`
`abc`
`BAC`
`bac`
etc...

我将如何在 JavaScript 中实现这一点?

5个回答

有2种基本方式:

var arr = [{name:"ABC"},{name:"BAC"},{name:"abc"},{name:"bac"}];

arr.sort(function(a,b){
  var alc = a.name.toLowerCase(), blc = b.name.toLowerCase();
  return alc > blc ? 1 : alc < blc ? -1 : 0;
 });

或者

arr.sort(function(a,b){
  return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
 });

请注意,第二个版本忽略变音符号,因此aà将按相同的字母排序。

现在这两种方式的问题是它们不会ABC在小写之前对大写进行排序abc,因为它会将它们视为相同的。

要解决这个问题,你必须这样做:

arr.sort(function(a,b){
  var alc = a.name.toLowerCase(), blc = b.name.toLowerCase();
  return alc > blc ? 1 : alc < blc ? -1 : a.name > b.name ? 1 : a.name < b.name ? -1 : 0;
});

localeCompare如果您不希望变音符号像这样影响排序,您可以再次选择使用

arr.sort(function(a,b){
  var lccomp = a.name.toLowerCase().localeCompare(b.name.toLowerCase());
  return lccomp ? lccomp : a.name > b.name ? 1 : a.name < b.name ? -1 : 0;
});

您可以在此处阅读有关排序的更多信息:https : //developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort

不适用于罗马尼亚语变音符号... :-(
2021-03-19 11:22:32

您可以传入对 Array.sort排序函数引用

连同接受的答案,这帮助我解决了这个问题。我认为它应该是公认答案的一部分。
2021-03-16 11:22:32
objects.sort(function(c, d) {
    return (
        c['name'].toLowerCase() > d['name'].toLowerCase() || 
            c['name'] > d['name']
    ) ? 1 : -1;
});

在那里看到http://jsfiddle.net/p8Gny/1/

@Martin Jespersen 谢谢你纠正我。
2021-04-01 11:22:32
这不是使用排序函数的正确方法,它需要 1,0,-1 的返回范围,而不是像您返回的 true,false 那样。在此处阅读文档:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
2021-04-10 11:22:32

您可以将自定义排序函数传递给sort()数组方法。以下将解决问题并考虑您对大写的要求。

objects.sort(function(o1, o2) {
    var n1 = o1.name, n2 = o2.name, ni1 = n1.toLowerCase(), ni2 = n2.toLowerCase();
    return ni1 === ni2 ? (n1 === n2 ? 0 : n1 > n2 ? 1 : -1) : (ni1 > ni2 ? 1 : -1);
});
我完全忽略了您必须比较名称而不是对象引用。这么简单的错误。
2021-03-17 11:22:32
@Raynos:不,我的函数比较name两个对象属性。我现在已经更新它以说明 OP 想要的关于大写的顺序。
2021-03-23 11:22:32
是不是和array.sort()我想你直接传入默认排序函数不一样。
2021-03-29 11:22:32

排序对象数组中稍微修改

yourobject.sort(function(a, b) {
    var nameA = a.name, nameB = b.name
    if (nameA < nameB) //Sort string ascending.
        return -1
    if (nameA > nameB)
        return 1
    return 0 //Default return value (no sorting).
})