中文数字转英文及含中文数字的对象数组过滤问题解决
解决中文数字识别问题,提取包含数字的时段对象
你的核心问题在于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
相关产品推荐
相关产品推荐

