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

中文数字转英文及含中文数字的对象数组过滤问题解决

解决中文数字识别问题,提取包含数字的时段对象

你的核心问题在于Number()无法识别中文数字,导致这类包含中文数字的label被误判。咱们可以通过建立中文数字映射表+自定义转换判断函数来解决这个问题,具体步骤如下:

1. 先做中文数字到阿拉伯数字的映射

先覆盖日常常用的中文数字(包括单个数字和十、百这类进位词),后续如果需要更大的数字(比如千、万)可以直接扩展:

const chineseNumberMap = {
  '零': 0,
  '一': 1,
  '二': 2,
  '三': 3,
  '四': 4,
  '五': 5,
  '六': 6,
  '七': 7,
  '八': 8,
  '九': 9,
  '十': 10,
  '百': 100,
  '千': 1000
};

2. 写个中文数字的转换/判断函数

这个函数会检查输入的字符串是不是中文数字,是的话返回对应的阿拉伯数字,不是就返回NaN,还能处理简单的组合数字(比如“十五”“二十三”):

function parseChineseNumber(str) {
  // 先处理单个中文数字的情况
  if (chineseNumberMap.hasOwnProperty(str)) {
    return chineseNumberMap[str];
  }
  
  // 处理组合中文数字的基础逻辑(比如“十五”“二十三”)
  const numChars = str.split('');
  let total = 0;
  let prevSingleNum = 0;
  
  for (const char of numChars) {
    const numValue = chineseNumberMap[char];
    if (!numValue) return NaN; // 混了非中文数字字符,直接返回NaN
    
    // 处理十、百、千这类进位词
    if (numValue >= 10) {
      total += prevSingleNum * numValue;
      prevSingleNum = 0;
    } else {
      prevSingleNum = numValue;
    }
  }
  total += prevSingleNum;
  return total || NaN;
}

3. 修改你的过滤逻辑

原来的代码是筛选不包含数字的对象,如果你需要的是提取包含数字的对象,记得去掉前面的!。现在把中文数字的判断加进去:

const periodsWithNumbers = allPeriods.filter(period => {
  return period.label.split(" ").some(word => {
    // 先尝试转阿拉伯数字,不行再试中文数字
    const arabicNum = Number(word);
    if (!isNaN(arabicNum)) return true;
    
    const chineseNum = parseChineseNumber(word);
    return !isNaN(chineseNum);
  });
});

测试一下效果

比如你的数组如果是:

const allPeriods = [
  {id: 1, label: "Last 30 days"},
  {id: 2, label: "Yesterday"},
  {id: 3, label: "最近四天"},
  {id: 4, label: "过去十小时"}
];

过滤后会得到id:1、3、4这三个对象,完全符合预期。

补充说明

  • toLocaleString是用来把阿拉伯数字格式化成指定地区的字符串的,反过来转数字本来就不适用,所以之前用它没效果是正常的;
  • 如果你的场景里有更复杂的中文数字(比如“一百二十三”),可以再扩展parseChineseNumber的逻辑,加入万、亿这类单位的处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:12:33