繁体   English   中英

根据嵌套值按字典顺​​序对对象数组进行排序

[英]Sort a array of objects lexicographically based on a nested value

使用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()})

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

我在这篇文章中阅读了javascript 中的字典序排序数组,只是直接使用 sort 而不是localeCompare ,这似乎可以解决问题。

localeCompare不按字典顺序排序。

'aaA'.localeCompare('aAA')返回-1 ,它在aaA之前aAA 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])
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM