JavaScript 对象数组按特定 属性 排序,然后按自定义优先级值分组
JavaScript array of objects sort by specific property and then group by custom priority values
我有一组对象,我的要求是按状态对用户进行分组(在线用户应该排在第一位),同时按名称对分组的用户进行排序。 我能够取得结果,但在这里我单独使用 lodash concat 函数。任何人都可以帮助将它与 chain 函数一起使用吗?
代码:
import _ from 'lodash';
const { online = [], offline = [] } = _.chain(users)
.sortBy([(e) => _.toLower(e.name)])
.groupBy((e) => e.status)
.value();
const result = _.concat(online, offline);
console.log('grouped users sorted by name => ', result);
输入:
let users = [
{
'name': 'C',
'status': 'online'
},
{
'name': 'd',
'status': 'online'
},
{
'name': 'a',
'status': 'offline'
},
{
'name': 'b',
'status': 'online'
},
{
'name': 'f',
'status': 'offline'
},
{
'name': 'e',
'status': 'offline'
}
];
输出:
[
{
'name': 'b',
'status': 'online'
},
{
'name': 'C',
'status': 'online'
},
{
'name': 'd',
'status': 'online'
},
{
'name': 'a',
'status': 'offline'
},
{
'name': 'e',
'status': 'offline'
},
{
'name': 'f',
'status': 'offline'
}
]
谢谢
您可以使用 reduce
、filter
和 sort
。创建一个单独的数组并按照您希望最终数组的顺序添加状态。然后在 reduce 回调中使用 filter
获取该状态的元素并使用 sort
按 name
let sortStatus = ['online', 'offline'];
let users = [{
name: 'C',
status: 'online'
},
{
name: 'd',
status: 'online'
},
{
name: 'a',
status: 'offline'
},
{
name: 'b',
status: 'online'
}
];
let data = sortStatus.reduce((acc, curr) => {
acc.push(
...users
.filter(item => item.status === curr)
.sort((a, b) => a.name.localeCompare(b.name))
);
return acc;
}, []);
console.log(data);
你也可以不用 lodash 轻松做到这一点。
您可以在调用数组的sort()
函数时使用自定义的排序函数。创建一个排序字符串,包括 0 表示在线用户,1 表示离线用户,后跟名称。然后在比较中使用这个排序字符串。
let users = [{
'name': 'C',
'status': 'online'
},
{
'name': 'd',
'status': 'online'
},
{
'name': 'a',
'status': 'offline'
},
{
'name': 'b',
'status': 'online'
},
{
'name': 'f',
'status': 'offline'
},
{
'name': 'e',
'status': 'offline'
}
];
users.sort((a, b) => {
let sortStringA = (a.status.toUpperCase() == 'ONLINE' ? 0 : 1) + a.name.toUpperCase();
let sortStringB = (b.status.toUpperCase() == 'ONLINE' ? 0 : 1) + b.name.toUpperCase();
if (sortStringA < sortStringB) {
return -1;
}
if (sortStringA > sortStringB) {
return 1;
}
return 0;
});
console.log(users);
如果您可以更正输入:
let users = [
{
name: 'C',
status: 'online'
},
{
name: 'd',
status: 'online'
},
{
name: 'a',
status: 'offline'
},
{
name: 'b',
status: 'online'
},
{
name: 'f',
status: 'offline'
},
{
name: 'e',
status: 'offline'
}
];
const sorted = users.sort((a, b) => {
if (a.name.toLowerCase() < b.name.toLowerCase()) {
return a.status.toLowerCase() < b.status.toLowerCase() ? 1 : -1;
}
return b.status.toLowerCase() < a.status.toLowerCase() ? -1 : 1;;
})
console.log(sorted )