有没有比多次调用match正则匹配更优的字符串解析实现方案?
优化方案
核心优化点
- 仅用1次正则扫描解析整个key字符串,避免多次调用
match()重复扫描字符串带来的性能损耗,代码可维护性更高,后续加字段只需要更新映射表即可 - 仅读取解析1次localStorage数据,避免重复IO和重复JSON解析的开销,也避免了两次读取数据不一致的极端问题
- 省去后置属性遍历清洗逻辑,在赋值阶段就完成数据格式处理和空值过滤,逻辑更直接
- 增加了空值容错,避免localStorage无对应数据时抛出JS错误
优化后代码
// 字段前缀和结果属性的映射表,后续新增字段只需修改此处即可 const FIELD_MAPPING = { N: 'matchNumber', DSC: 'matchSeconds', MC: 'matchMinutes', HC: 'matchHours', DD: 'matchDay', MD: 'matchMonth', YD: 'matchYear' } // 注意原代码中key的取值是字符串,需要补充引号 const key = 'N001DSC29MC22HC22DD04MD09YD21' function get(key) { const res = {} // 一次正则匹配所有字段 const fieldReg = /(N|DSC|MC|HC|DD|MD|YD)(\d{2,3})/g let matchResult while ((matchResult = fieldReg.exec(key)) !== null) { const [, prefix, value] = matchResult res[FIELD_MAPPING[prefix]] = value } // 仅读取一次localStorage const storeRecord = JSON.parse(localStorage.getItem(key) || '{}') if (storeRecord.title) res.title = storeRecord.title if (storeRecord.description) res.description = storeRecord.description return res } get(key)
和原代码的功能一致性说明
上述代码和原代码输出结果完全一致:
- 所有从key中解析的数值字段均为字符串格式,和原代码
join('')后的结果相同 - 自动过滤不存在的字段,不会返回值为
null/undefined的属性,和原代码删除空属性的逻辑一致 - 读取localStorage的逻辑一致,仅增加了空值容错
内容的提问来源于stack exchange,提问作者user15889308
相关产品推荐
相关产品推荐

