【问题标题】:Sort an array of objects lexicographically based on a nested value根据嵌套值按字典顺​​序对对象数组进行排序
【发布时间】:2011-12-16 20:48:49
【问题描述】:

使用 JavaScript,我想知道如何根据每个对象中的字符串值按字典顺​​序对对象数组进行排序。

考虑:

[
 {
    "name" : "bob",
    "count" : true
    "birthday" : 1972
 },
      {
    "name" : "jill",
    "count" : false
    "birthday" : 1922
 },
      {
    "name" : "Gerald",
    "count" : true
    "birthday" : 1920
 }
 ]

如何按名称的字母顺序对数组进行排序?

名称值是用户名,所以我想保持字母大小写。

【问题讨论】:

标签: javascript json sorting


【解决方案1】:
var obj = [...];

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

请注意,这不会考虑大写(因此它会将所有以大写开头的名称排序在所有以小写开头的名称之前,即"Z" < "a"),因此您可能会发现在其中添加toUpperCase() 很重要.

你也可以让它更通用:

function sortFactory(prop) {
   return function(a,b){ return a[prop].localeCompare(b[prop]); };
}

obj.sort(sortFactory('name')); // sort by name property
obj.sort(sortFactory('surname')); // sort by surname property

如果您将比较器传递给工厂,则更通用...

【讨论】:

  • 使用toLocaleUpperCase/toLocaleLowerCase 而不是toUpperCase/toLowerCase
  • 这个答案不再成立(至少在当前的 chrome 开发控制台上)。 ["a", "A", "b", "B"].sort((a,b)=>{return a.localeCompare(b)}) 应该是 ["A", "B", "a", "b"] 但返回 ["a", "A", "b", "B"]
  • @user3240644 所说的。 'aaA'.localeCompare('aAA') 返回 -1,它在 aAA 之前排序 aaA,这在字典顺序的情况下是不正确的
【解决方案2】:

这样就可以了:

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

【讨论】:

  • 感谢您的回复,但是在我的数据的情况下,我忘记指定名称实际上是用户名,所以我想维护提供的大小写
  • 没问题;我已经更新了我的代码。很高兴它是通过@davin 的回答排序的。
【解决方案3】:

使用比较

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

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String#Comparing_strings

【讨论】:

    【解决方案4】:

    我在这篇文章中读到 sort array lexicographically in javascript 直接使用排序而不是 localeCompare,这似乎可以解决问题。

    localeCompare 不按字典顺序排序。

    'aaA'.localeCompare('aAA') 返回-1,它在aAA 之前排序aaA。在 lex 中,大写在前,所以应该是['aAA', 'aaA']

    你可以做这样的事情来处理一些情况。

    export default function sortLex ({ arr, prop, reverse }) {
      let sorted
      if (prop) {
        sorted = arr.sort(sortFactory(prop))
      } else sorted = arr.sort(sort)
    
      return reverse ? sorted.reverse() : sorted
    }
    
    function sort (a, b) {
      if (a < b) {
        return -1
      }
      if (a === b) {
        return 0
      }
      if (a > b) {
        return 1
      }
    }
    
    function sortFactory (prop) {
      return (a, b) => {
        return sort(a[prop], b[prop])
      }
    }
    

    【讨论】:

    • 在你的 sort() 函数中,如果 a 和 b 没有排序会发生什么?
    猜你喜欢
    • 2014-05-01
    • 2020-01-22
    • 1970-01-01
    • 2021-06-05
    • 2021-03-08
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    相关资源
    最近更新 更多