You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于属性是否存在对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:15:04