如何在JavaScript中按多个属性对对象数组进行升序排序
问题原因
你的代码存在两处逻辑错误:
- 判断顺序不符合优先级规则:你把
divisible相等的判断放在了「pricePerUnitPerHour不相等」的分支下,永远不会触发「前两个属性都相等时按时间排序」的逻辑 - 当
pricePerUnitPerHour相等时,你直接返回divisible的差值,当divisible也相等时会直接返回0,不会继续判断时间字段
修复方案
按照「价格→是否可拆分→创建时间」的优先级依次嵌套判断即可,正确代码如下:
arr.sort(function (a, b) { // 优先按pricePerUnitPerHour升序排序 if (a.pricePerUnitPerHour !== b.pricePerUnitPerHour) { return a.pricePerUnitPerHour - b.pricePerUnitPerHour; } // 价格相等时按divisible排序,true排在false前面 if (a.divisible !== b.divisible) { return b.divisible - a.divisible; } // 前两个属性都相等时按时间戳升序排序,本身是数字不需要转Date return a.creationDateTime - b.creationDateTime; });
逻辑说明
- 第一层直接对比优先级最高的
pricePerUnitPerHour,数值不等时直接返回差值,无需走后续判断 - 布尔值
divisible会隐式转换为数字计算:true转1、false转0,b.divisible - a.divisible可以保证值为true的项排在前面 creationDateTime本身就是毫秒级时间戳数字,直接相减即可实现升序排序,不需要额外用new Date转换
内容的提问来源于stack exchange,提问作者user17190872
相关产品推荐
相关产品推荐

