JavaScript 根据值对对象数组进行排序(条件排序)

标签 javascript jquery arrays json sorting

我有一个像这样的数组:

[{"category_id":101,"category_name":"abc","state":null},
{"category_id":204,"category_name":"test","state":null},
{"category_id":7,"category_name":"pqr","state":"1526985908122"},
{"category_id":103,"category_name":"User","state":null},
{"category_id":2,"category_name":"System","state":null},
{"category_id":205,"category_name":"xyz","state":"1526985908019"},
{"category_id":203,"category_name":"dash","state":null},
{"category_id":4,"category_name":"hello","state":null},
{"category_id":206,"category_name":"demo","state":"1526985908187"},
{"category_id":6,"category_name":"about","state":null},
{"category_id":3,"category_name":"role","state":null}]

我想根据 state 属性的值对这个数组进行排序,就像你可以看到 state 在这里有 null 和一些数值。

如果 state != null 则按升序排序并且 如果 state == null 则按降序排序(基于类别 ID)

所以实际结果应该是这样的:

[{"category_id":205,"category_name":"xyz","state":"1526985908019"},
{"category_id":7,"category_name":"pqr","state":"1526985908122"},
{"category_id":206,"category_name":"demo","state":"1526985908187"},
{"category_id":204,"category_name":"test","state":null},
{"category_id":203,"category_name":"dash","state":null},
{"category_id":103,"category_name":"User","state":null},
{"category_id":101,"category_name":"abc","state":null},
{"category_id":6,"category_name":"about","state":null},
{"category_id":4,"category_name":"hello","state":null},
{"category_id":3,"category_name":"role","state":null},
{"category_id":2,"category_name":"System","state":null}]

因此,它应该根据状态值按升序对前 3 条记录进行排序,并根据类别 ID 按空值降序对其他记录进行排序。

这是我尝试引用这篇文章的内容: https://technology.amis.nl/2007/08/24/how-to-fix-your-number-sorting-problems-in-javascript/

var ALMOST_ZERO = -0.00000001;  
records.sort(function(a,b){         
    console.log(`comparing ${a.state},${b.state}`);
    var left = a.state != null ? a.state : ALMOST_ZERO;
    var right = b.state != null ? b.state : ALMOST_ZERO;    
    return right-left;
});

如有任何帮助,我们将不胜感激。

谢谢

最佳答案

这是一个简洁的版本。通过使用 ||,只要上面的表达式计算结果为 0,它就会继续测试下一个较低的表达式:

const arr=[{"category_id":101,"category_name":"abc","state":null},{"category_id":204,"category_name":"test","state":null},{"category_id":7,"category_name":"pqr","state":"1526985908122"},{"category_id":103,"category_name":"User","state":null},{"category_id":2,"category_name":"System",state:null},{"category_id":205,"category_name":"xyz","state":"1526985908019"},{"category_id":203,"category_name":"dash","state":null},{"category_id":4,"category_name":"hello","state":null},{"category_id":206,"category_name":"demo","state":"1526985908187"},{"category_id":6,"category_name":"about","state":null},{"category_id":3,"category_name":"role","state":null}]

arr.sort((a, b) => (
  (a.state === null) - (b.state === null)
  || a.state - b.state
  || b.category_id - a.category_id
));
console.log(arr);

控制台版本:

enter image description here

ES5 版本:

var arr = [{ "category_id": 101, "category_name": "abc", "state": null }, { "category_id": 204, "category_name": "test", "state": null }, { "category_id": 7, "category_name": "pqr", "state": "1526985908122" }, { "category_id": 103, "category_name": "User", "state": null }, { "category_id": 2, "category_name": "System", state: null }, { "category_id": 205, "category_name": "xyz", "state": "1526985908019" }, { "category_id": 203, "category_name": "dash", "state": null }, { "category_id": 4, "category_name": "hello", "state": null }, { "category_id": 206, "category_name": "demo", "state": "1526985908187" }, { "category_id": 6, "category_name": "about", "state": null }, { "category_id": 3, "category_name": "role", "state": null }];

arr.sort(function (a, b) {
  return (a.state === null) - (b.state === null) || a.state - b.state || b.category_id - a.category_id;
});
console.log(arr);

关于JavaScript 根据值对对象数组进行排序(条件排序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50480238/

相关文章:

php - 将特定字段收集到数组中

javascript - Bootstrap——等待视频播放完毕,然后再滑动到下一个轮播

javascript - 递归获取所有 child

javascript - jquery - 获取元素的出现

javascript - jquery 源代码,带换行符的类名?

ios - Swift 4 按第一个值排序字典

javascript - 如何使用 AngularJS 或 JavaScript 解码 URL 参数?

javascript - 如何在 Jest 测试中真正调用 fetch

javascript - 运动气泡图

C 数组和指针