JavaScript对象双字段排序问题:按min、price升序排序异常排查
JavaScript对象数组按双字段升序排序的正确实现
你的问题出在排序回调里用了&&逻辑运算符——这不符合sort函数的预期规则。sort的回调需要返回数字差值:返回负数则a排在b前,正数则b排在a前,0则顺序不变。而&&会把第一个非零的差值转为布尔值(true对应1,false对应0),这直接打乱了排序逻辑,导致最终只按price排序。
正确的多字段升序排序逻辑应该是:
- 先比较
min字段的差值,若差值不为0,直接用这个差值决定顺序 - 若
min字段相等(差值为0),再比较price字段的差值
下面是修正后的代码:
const cardItems = [ { "min": 8, "price": 2 }, { "min": 3, "price": 1 }, { "min": 9, "price": 4 }, { "min": 360, "price": 9 } ]; const sortCardItems = cardItems .slice() // 复制原数组避免修改原数据 .sort((a, b) => { // 先转成数字(如果你的min/price本来就是数字可以省略parseInt) const minDiff = parseInt(a.min, 10) - parseInt(b.min, 10); if (minDiff !== 0) { return minDiff; } // min相等时再比较price return parseInt(a.price, 10) - parseInt(b.price, 10); }); console.log(sortCardItems);
执行后得到的排序结果(按min升序,min相同则按price升序):
[ { "min": 3, "price": 1 }, { "min": 8, "price": 2 }, { "min": 9, "price": 4 }, { "min": 360, "price": 9 } ]
注:如果你的min和price字段本身就是数字类型(不是字符串),可以直接去掉parseInt,简化为a.min - b.min和a.price - b.price。
内容的提问来源于stack exchange,提问作者Programmer
相关产品推荐
相关产品推荐

