如何基于属性是否存在对JavaScript数组对象进行排序
调整方案
问题原因
你当前的排序回调逻辑完全反向了:Array.sort()的回调返回正数时,参数a会被排在参数b后面,你现在的判断是如果a存在out_of_stock_detail属性就返回1,会把带该属性的元素往后放,刚好和需求相反。
修正后的代码
写法1(易读版)
const arr = [{ "item_name": "Cake", "quantity": 1, }, { "item_name": "Choclate", "out_of_stock_detail": { "out_of_stock_quantity": 1 }, "quantity": 3, } ] let output = arr.sort((a, b) => { // a有属性、b没有,a放前面,返回负数 if (a.out_of_stock_detail && !b.out_of_stock_detail) { return -1 } // b有属性、a没有,b放前面,返回正数 if (!a.out_of_stock_detail && b.out_of_stock_detail) { return 1 } // 两者都有或者都没有,顺序不变 return 0 }) console.log(output)
写法2(简化版)
利用布尔值转数字的特性(true转1,false转0),可以直接写成:
let output = arr.sort((a, b) => !!b.out_of_stock_detail - !!a.out_of_stock_detail)
额外说明
sort是原地排序方法,会直接修改原数组,如果不想改动原数组,可以先拷贝再排序:
// 两种拷贝方式选一种即可 let output = [...arr].sort((a, b) => !!b.out_of_stock_detail - !!a.out_of_stock_detail) // 或者 let output = arr.slice().sort((a, b) => !!b.out_of_stock_detail - !!a.out_of_stock_detail)
内容的提问来源于stack exchange,提问作者dev
相关产品推荐
相关产品推荐

