gpt4 book ai didi

Javascript localecompare - 首先排序的大写字母

转载 作者:行者123 更新时间:2023-11-30 20:38:22 26 4
gpt4 key购买 nike

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

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

[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 属性,指定大写和小写字母。

下面使用 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>

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

最佳答案

因为 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);
});

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

关于Javascript localecompare - 首先排序的大写字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49575225/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com