【发布时间】:2018-03-30 13:17:53
【问题描述】:
我正在尝试对包含 lastName 和 firstName 属性的对象数组进行排序。如果对象具有相同的lastName,我希望对象按asc 顺序按lastName 排序,然后按firstName 按asc 顺序排序。
以下是我需要的排序顺序(标准字母排序顺序)。
[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