【问题标题】:Sort JavaScript array of Objects based on one of the object's properties [duplicate]根据对象的属性之一对对象的JavaScript数组进行排序[重复]
【发布时间】:2011-07-22 05:33:18
【问题描述】:

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

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

如何在 JavaScript 中实现这一点?

【问题讨论】:

  • 今日名言:'我有一个数组对象,它是一个对象数组'
  • 这不是array.sort() 吗?它完全符合您的要求。
  • @Raynos:不,它没有。您需要比较每个对象的name 属性,如果没有自定义函数,sort() 将无法做到这一点。
  • 这是在 2011 年 3 月 24 日提出的,而另一个问题是在 2011 年 7 月 15 日提出的。这怎么可能是复制品?

标签: javascript


【解决方案1】:

有两种基本方式:

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

【讨论】:

  • 不适用于罗马尼亚语变音符号... :-(
【解决方案2】:

【讨论】:

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

http://jsfiddle.net/p8Gny/1/

【讨论】:

【解决方案4】:

您可以将自定义排序函数传递给数组的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);
});

【讨论】:

  • 这和array.sort()不一样吧我想你只是直接传入了默认的排序函数。
  • @Raynos:不,我的函数比较了两个对象的name 属性。我现在已经更新了它,以说明 OP 想要的关于大写的顺序。
  • 我完全忽略了您必须比较名称而不是对象引用。这么简单的错误。
【解决方案5】:

Sorting an array of objects略有修改,

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).
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-17
    • 2012-10-22
    • 2023-03-15
    • 2017-05-31
    • 2017-07-18
    • 1970-01-01
    • 2021-02-11
    相关资源
    最近更新 更多