有个对象数组排序功能需求,需要对这个数组元素对象里头的两个字段进行判断。最直观想法是循环第一次判断第一个字段得到的新数组,再去循环这个新数组再判断第二个字段。这种方式逻辑直观,但是循环次数多,而且代码量也大。后来发现了
sort()
方法。
具体需求:
- 在线状态的排在前面,离线的在后面
- 在满足状态排序后databases字段长度按照小到大排序
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
var datas = [
{
"status": "离线",
"children": [1,2,3]
},
{
"status": "在线",
"children": [1,2,3]
},
{
"status": "离线",
"children": [1,5,6,8]
},
{
"status": "离线",
"children": [2,3]
},
{
"status": "在线",
"children": [1]
}
];
function sortBy2Key(datas){
datas.sort(function(a, b){
// 状态:中文转换成数字比较,期望放在前面的使用小的数字。
let statusA = a.status === '在线' ? 0 : 1;
let statusB = b.status === '在线' ? 0 : 1;
let lenA = a.children.length;
let lenB = b.children.length;
return statusA - statusB || lenA - lenB;
});
}
sortBy2Key(datas);
console.log(datas);
</script>
</body>
</html>
代码运行结果
sort应该也能比较中文,应该是按照汉字编码数值来,具体还没有翻文档和测试下。但在本次案例种,还是得转换成期望比较顺序的数值。
参考文章
- 如何通过 JavaScript 中的两个字段对对象数组进行排序?
image.png