如何忽略正负值,按字符串属性值对对象数组排序?
按指定规则排序JavaScript对象数组
需要对以下对象数组按照忽略正负,按绝对值从大到小排列,相同绝对值的正数在前、负数在后的规则排序:
原始数组:
var obj = [ {band: "3", name: "positive"}, {band: "-3", name: "positive"}, {band: "1", name: "positive"}, {band: "4", name: "positive"}, {band: "-2", name: "positive"}, {band: "2", name: "positive"} ];
期望排序后的结果:
var obj = [ {band: "4", name: "positive"}, {band: "3", name: "positive"}, {band: "-3", name: "positive"}, {band: "2", name: "positive"}, {band: "-2", name: "positive"}, {band: "1", name: "positive"} ];
解决方案
直接用数组的sort()方法,自定义排序逻辑即可:
obj.sort((a, b) => { const numA = Number(a.band); const numB = Number(b.band); // 先按绝对值降序排列 const absDiff = Math.abs(numB) - Math.abs(numA); if (absDiff !== 0) { return absDiff; } // 绝对值相同时,正数在前 return numB - numA; });
逻辑说明
- 先把
band的字符串转成数值类型,避免字符串比较的坑(比如"10"会被当成比"2"小); - 优先比较两个值的绝对值,用后一个数的绝对值减去前一个,实现绝对值从大到小的排序;
- 如果绝对值相等,直接比较数值本身,正数的数值大于负数,所以正数会排在负数前面。
内容的提问来源于stack exchange,提问作者KRISH JACKMAN
相关产品推荐
相关产品推荐

