【问题标题】:Javascript localecompare - Uppercase letters to be sorted firstJavascript localecompare - 首先对大写字母进行排序
【发布时间】:2018-03-30 13:17:53
【问题描述】:

我正在尝试对包含 lastNamefirstName 属性的对象数组进行排序。如果对象具有相同的lastName,我希望对象按asc 顺序按lastName 排序,然后按firstNameasc 顺序排序。

以下是我需要的排序顺序(标准字母排序顺序)。

[symbols, numbers, 'A-Z', 'a-z']

我使用了localeCompare,但它按以下排序顺序对字符串进行排序。

[symbols, numbers, 'a-z', 'A-Z'] 

小写字母在大写字母之前

例如:如果数组包含以下元素

let guests = [
{
lastName: "guest",
firstName: "abc"
},
{
lastName: "Guest",
firstName: "test"
},
{
lastName: "guest",
firstName: "Abc"
},
{
lastName: "guest",
firstName: "123"
}
];

我希望对象按如下方式排序:

[
    {
    lastName: "Guest",
    firstName: "test"
    },
    {
    lastName: "guest",
    firstName: "123"
    },
    {
    lastName: "guest",
    firstName: "Abc",
    },
    {
    lastName: "guest",
    firstName: "abc"
    }
]

但我得到的结果是

[
    {
    lastName: "guest",
    firstName: "123"
    },
    {
    lastName: "guest",
    firstName: "abc"
    },
    {
    lastName: "guest",
    firstName: "Abc",
    },
    {
    lastName: "Guest",
    firstName: "test"
    }
]

下面是我试过的代码。

let guests = [
              {
                lastName: "guest",
                firstName: "abc"
              },
              {
                lastName: "Guest",
                firstName: "test"
              },
              {
                lastName: "guest",
                firstName: "Abc"
              },
              {
                lastName: "guest",
                firstName: "123"
              }
            ];

            guests.sort((a, b) => {
              if (_.get(a, 'lastName') === _.get(b, 'lastName')) {
                return _.get(a, 'firstName', '').localeCompare(_.get(b, 'firstName', ''));
              } else {
                return _.get(a, 'lastName', '').localeCompare(_.get(b, 'lastName', ''));
              }
            });
            
             console.log(guests);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>

我从localeCompare 的文档中了解到,它接受options 对象,我们可以在其中指定caseFirst 属性,指定大写和小写字母的排序顺序。

下面的代码 sn-p 使用 options 参数产生了我期望的输出,但问题是,所有浏览器还没有支持它。

					let guests = [
        {
        lastName: "guest",
        firstName: "abc"
        },
        {
        lastName: "Guest",
        firstName: "test"
        },
        {
        lastName: "guest",
        firstName: "Abc"
        },
        {
        lastName: "guest",
        firstName: "123"
        }
        ];
        
    guests.sort((a, b) => {
                          if (_.get(a, 'lastName') === _.get(b, 'lastName')) {
                            return _.get(a, 'firstName', '').localeCompare(_.get(b, 'firstName', ''), undefined, {caseFirst: 'upper'});
                          } else {
                            return _.get(a, 'lastName', '').localeCompare(_.get(b, 'lastName', ''), undefined, {caseFirst: 'upper'});
                          }
                        });
                        
    console.log(guests);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>

有什么方法可以在不使用 options 参数的情况下完成结果。是否有可以传递给 JS array.sort() 的自定义排序方法来实现我的目标。请帮忙。

【问题讨论】:

  • 可以分享一下工作的sn-p吗?
  • 我已经分享了我试过的自定义排序方法。
  • 您可以使用工具栏中的<> 来创建一个有效的sn-p。
  • 谢谢。我在我的问题中添加了有效的 sn-ps。

标签: javascript arrays sorting


【解决方案1】:

由于aA 在不区分大小写的比较中被视为相等,因此未指定它们的排序顺序。您需要检查它们是否匹配,如果不匹配,则应用您的自定义排序。

guests.sort((a,b) => {
    return _.get(a, 'lastName', '').localeCompare(_.get(b, 'lastName', ''))
    || _.get(a, 'firstName', '').localeCompare(_.get(b, 'firstName', ''))
    || (_.get(a, 'lastName', '') > _.get(b, 'lastName', '') ? 1 : -1);
});

这将按姓氏排序,然后按名字排序,然后(如果两者相等)它将大写在小写之前排序(因为这是二进制字符串比较的工作方式)。

【讨论】:

  • 尝试了您提供的代码。我得到相同的结果。小写字母在大写之前。
猜你喜欢
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 2013-02-01
  • 2021-12-28
  • 2019-02-14
  • 2018-06-14
相关资源
最近更新 更多