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

如何按自定义状态优先级从对象数组中获取最小状态?

问题描述

状态优先级定义:Not Started(最低)< Submitted < Complete(最高)。需求是从对象数组中筛选出优先级最低的状态;若数组仅含一项,则直接返回该状态。现有用Math.min实现的getMin函数无法正确运行,求正确实现思路。

当前代码(无法正常运行)

getMin(id:number , key:string) {
    let data = [
      {
          "id": 14,
          "status": "Submitted",
      },
      {
          "id": 15,
          "status": "Not Started",
      }
  ]
    let min = Math.min(...data.map(item => item.status));
    console.log('result' , min)
  }

状态优先级对应关系

statuses: any[] = [
    { viewValue: 'Not Started', value: 1 },
    { viewValue: 'Submitted', value: 2 },
    { viewValue: 'Complete', value: 3 },
  ]

示例与预期结果

  • 示例1:
data = [
    {
        "id": 14,
        "status": "Submitted",
    },
    {
        "id": 15,
        "status": "Not Started",
    }
]

预期结果:Not Started

  • 示例2:
data = [
        {
            "id": 14,
            "status": "Submitted",
        },
         {
            "id": 17,
            "status": "Complete",
        }
    ]

预期结果:Submitted

  • 示例3:
data = [
         {
            "id": 17,
            "status": "Complete",
        }
    ]

预期结果:Complete


解决方案

问题根源

Math.min仅支持数值类型的比较,直接传入字符串会被转换为NaN,导致无法得到正确结果。我们需要先将状态文本映射为对应的优先级数值,再基于数值比较找出最小优先级的状态。

实现思路

  1. 构建状态-优先级映射:把状态文本和对应的优先级数值做成键值对,方便快速查找每个状态的优先级。
  2. 遍历数组筛选最小状态:
    • 若数组长度为1,直接返回该元素的状态。
    • 否则,遍历数组,比较每个元素状态的优先级数值,保留数值最小的状态。用数组的reduce方法可以高效完成这个比较过程。

完整代码实现

getMin(id: number, key: string) {
    const data = [
      { "id": 14, "status": "Submitted" },
      { "id": 15, "status": "Not Started" }
    ];

    // 构建状态到优先级的映射,比原数组更便于查找
    const statusPriority: Record<string, number> = {
      'Not Started': 1,
      'Submitted': 2,
      'Complete': 3
    };

    // 处理数组为空的边界情况(可选,根据需求补充)
    if (data.length === 0) {
      return null; // 或者返回你需要的默认值
    }

    // 数组仅一项时直接返回状态
    if (data.length === 1) {
      return data[0].status;
    }

    // 用reduce遍历数组,找出优先级最小的状态
    const minStatus = data.reduce((prev, current) => {
      return statusPriority[prev.status] < statusPriority[current.status] ? prev : current;
    }).status;

    console.log('result', minStatus);
    return minStatus;
}

验证示例

  • 示例1中,reduce比较Submitted(优先级2)和Not Started(优先级1),最终返回Not Started。
  • 示例2中,比较Submitted(2)和Complete(3),返回Submitted。
  • 示例3中,数组长度为1,直接返回Complete。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:48:40