Javascript 根据嵌套值按字典顺序对对象数组排序

Javascript 根据嵌套值按字典顺序对对象数组排序,javascript,json,sorting,Javascript,Json,Sorting,使用Javascript,我想知道如何根据每个对象中的字符串值对对象数组进行字典排序 考虑: [ { "name" : "bob", "count" : true "birthday" : 1972 }, { "name" : "jill", "count" : false "birthday" : 1922 }, { "name" : "Gerald", "count" : true "bir

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

考虑:

[
 {
    "name" : "bob",
    "count" : true
    "birthday" : 1972
 },
      {
    "name" : "jill",
    "count" : false
    "birthday" : 1922
 },
      {
    "name" : "Gerald",
    "count" : true
    "birthday" : 1920
 }
 ]
如何按名称的字母顺序对数组排序? 名称值是用户名,因此我希望保留字母大小写

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
如果您将比较器传递给工厂,则更为通用…

这样做:

arr.sort(function(a, b) {
    return a.name.localeCompare(b.name);
});
使用比较

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

我在这篇文章中读到,直接使用sort,而不是
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])
  }
}
导出默认函数sortLex({arr,prop,reverse}){
分类
如果(道具){
排序=arr.sort(sortFactory(prop))
}else sorted=arr.sort(排序)
返回反向?已排序。反向():已排序
}
函数排序(a,b){
if(ab){
返回1
}
}
函数排序工厂(prop){
返回(a,b)=>{
返回排序(a[prop],b[prop])
}
}

可能重复的可能重复的-感谢您的回复,但是我忘记在我的数据中指定名称实际上是用户名,因此我希望维护提供的大小写没有问题;我已经更新了我的代码。很高兴通过@davin的答案对它进行了排序。使用
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
,这在字典顺序的情况下是不正确的