如何实现JSON值与数组值近似匹配替换及让includes()返回匹配值
解决批发商名称匹配与替换问题
看起来你已经有了基础的匹配思路,但要实现返回对应批发商全称和近似匹配这两个需求,我们可以通过构建标准化映射表的方式来解决,下面是具体的方案:
核心思路
- 构建映射表:把批发商数组中的每个条目处理成「标准化名称 → 原全称」的键值对,这样匹配到后就能直接拿到原名称,而不是布尔值。
- 统一标准化规则:对批发商名称和JSON中的值都应用相同的标准化处理,消除大小写、空格、特殊符号(比如横杠)的差异,实现近似匹配。
具体代码实现
第一步:编写标准化函数
首先定义一个函数,把字符串转换成统一的格式,忽略大小写、空格和特殊符号:
function normalizeWholesalerName(name) { // 转大写 + 移除所有非字母数字的字符 return name.toUpperCase().replace(/[^A-Z0-9]/g, ''); }
第二步:构建批发商映射表
用reduce把原批发商数组转换成映射表,键是标准化后的名称,值是原全称:
const wholesalers = [ "B536 - T QUALITY LTD", ]; const wholesalerMap = wholesalers.reduce((map, wholesaler) => { // 处理原批发商名称:去掉前7位 + 移除末尾的"LTD" const processedWholesaler = wholesaler.substring(7).replace(" LTD", ""); // 生成标准化的键 const normalizedKey = normalizeWholesalerName(processedWholesaler); // 存入映射表 map[normalizedKey] = wholesaler; return map; }, {});
执行后,wholesalerMap会是:{ "TQUALITY": "B536 - T QUALITY LTD" }
第三步:处理JSON数据
遍历JSON数组,对每个条目进行标准化匹配,替换为对应的批发商全称:
const data = [ { 'Preferred Wholesaler': 'T-Quality' }, { 'Preferred Wholesaler': 'T Quality' } ]; const newRecords = data.map(record => { const originalName = record["Preferred Wholesaler"]; // 标准化JSON中的名称 const normalizedRecordName = normalizeWholesalerName(originalName); // 从映射表中查找匹配的全称 const matchedFullName = wholesalerMap[normalizedRecordName]; // 如果匹配到就替换,没匹配到可以保留原名称(或者换成你需要的默认值) return { ...record, ["Preferred Wholesaler"]: matchedFullName || originalName }; });
效果验证
执行上面的代码后,newRecords的结果会是:
[ { 'Preferred Wholesaler': 'B536 - T QUALITY LTD' }, { 'Preferred Wholesaler': 'B536 - T QUALITY LTD' } ]
不管JSON里的名称是T-Quality还是T Quality,都能正确匹配到对应的批发商全称。
扩展说明
如果需要更宽松的匹配(比如包含关系,比如JSON里的T QUAL也能匹配到T QUALITY),可以修改匹配逻辑,比如用Object.keys(wholesalerMap).find(key => key.includes(normalizedRecordName))来查找键,但这种方式可能会有多个匹配的情况,需要额外处理优先级。
内容的提问来源于stack exchange,提问作者Perry
相关产品推荐
相关产品推荐

