如何基于指定标准名称列表清理JS数组中汽车Model属性的冗余内容?
实现思路
- 统一转换为小写匹配,规避大小写差异导致的匹配失败问题
- 采用最长匹配优先规则:标准名称包含的单词数越多、匹配优先级越高,避免短名称命中所有长名称的问题
- 逐个校验标准名称的所有单词是否都存在于原始Model字符串的单词集合中,全命中则视为匹配候选
实现代码
function cleanCarModel(rawModel, cleanNames) { // 原始模型转小写拆为单词集合,提升校验效率 const rawWordSet = new Set(rawModel.toLowerCase().split(/\s+/)); // 标准名按单词数降序排序,优先匹配更长的标准名 const sortedCleanNames = [...cleanNames].sort((a, b) => { return b.split(/\s+/).length - a.split(/\s+/).length; }); // 遍历找到第一个全匹配的标准名 for (const cleanName of sortedCleanNames) { const cleanWords = cleanName.toLowerCase().split(/\s+/); const isAllMatch = cleanWords.every(word => rawWordSet.has(word)); if (isAllMatch) return cleanName; } // 无匹配时返回原始值,可根据需求自行调整 return rawModel; } // 测试调用 const cars = [{ Id: 1, Model: 'Transit 350 L3 Van' }, { Id: 2, Model: 'Transit Custom 300 L2' }, { Id: 3, Model: 'Transit Connect' }]; const cleanNames = ['Transit Van', 'Transit Custom', 'Transit Connect']; const processedCars = cars.map(item => ({ ...item, CleanModel: cleanCarModel(item.Model, cleanNames) })); console.log(processedCars);
输出结果
处理后每条数据会新增CleanModel字段,对应值如下:
- Id 1:Transit Van
- Id 2:Transit Custom
- Id 3:Transit Connect
该方案兼容动态生成的冗余词汇,后续新增标准名称也会自动按最长优先规则匹配,无需调整核心逻辑。
内容的提问来源于stack exchange,提问作者Mads Hjorth
相关产品推荐
相关产品推荐

