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

如何对JS对象及嵌套对象按属性值降序排序并按要求展示

JS对象按属性值降序排序(含嵌套对象)的实现方案

你可以通过递归处理对象+按值降序排序键值对+重新构建有序对象的方式实现需求。ES6+ 标准中,JS 对象的字符串类型属性会严格按照插入顺序保留,完全可以满足排序展示要求。

完整实现代码

// 计算属性的排序权重,可根据业务规则调整
function getSortValue(val, key, parentObj) {
  // 数字类型直接返回值作为权重
  if (typeof val === 'number') return val
  // 嵌套的优惠对象按同品类的价格权重排序,适配你的业务场景
  if (typeof val === 'object' && key.endsWith('Savings')) {
    const prefix = key.replace('Savings', '')
    return parentObj[`${prefix}Price`] || 0
  }
  // 其他通用对象取内部最大值作为权重
  return Math.max(...Object.values(val))
}

// 递归按属性值降序排序对象
function sortObjectByValueDesc(obj) {
  // 非对象、数组、null 类型直接返回,无需处理
  if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {
    return obj
  }
  // 转成 entries 数组后按权重降序排序
  const sortedEntries = Object.entries(obj).sort((a, b) => {
    const weightA = getSortValue(a[1], a[0], obj)
    const weightB = getSortValue(b[1], b[0], obj)
    return weightB - weightA
  })
  // 递归处理每个值,再转成新的有序对象
  return Object.fromEntries(
    sortedEntries.map(([key, val]) => [key, sortObjectByValueDesc(val)])
  )
}

调用示例

// 你的原始数据
const originData = {
  "carDetails": {
    "suvPrice": 60,
    "suvSavings": {
      "10% Off": 10,
      "20% Off": 20,
      "Fire Sale": 30
    },
    "truckPrice": 90,
    "truckSavings": {
      "10% Off": 10,
      "Buy Now": 40
    }
  }
}

// 调用排序
const sortedData = {
  carDetails: sortObjectByValueDesc(originData.carDetails)
}

// 打印验证,输出顺序和你期望的完全一致
console.log(JSON.stringify(sortedData, null, 2))

注意事项

  • 该方案仅兼容ES6及以上运行环境,老旧浏览器(如IE)不保证对象属性顺序
  • 如果仅需按顺序渲染展示,不需要保留对象结构,可以直接使用排序后的entries数组渲染,兼容性更强
  • 可以修改getSortValue函数的逻辑,灵活适配不同的排序规则

内容的提问来源于stack exchange,提问作者fosho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:06:01