按字典顺序对基于嵌套值的对象数组进行排序

时间:2011-12-16 20:48:49

标签: javascript json sorting

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

考虑:

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

如何按名称按字母顺序对数组进行排序? 名称值是用户名,所以我想保留字母大小写。

4 个答案:

答案 0 :(得分:30)

var obj = [...];

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

请注意,这不会考虑大小写(所以它会在所有以小号开头的所有名称之前命令所有以大写字母开头的名称,即"Z" < "a"),因此您可能会发现添加{{1在那里。

你也可以使它更通用:

toUpperCase()

如果你将比较器传递给工厂,那就更通用了......

答案 1 :(得分:3)

这样做:

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

答案 2 :(得分:2)

使用比较

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

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

答案 3 :(得分:0)

我在这篇文章sort array lexicographically in javascript中读到的只是直接使用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])
  }
}
相关问题