如何仅使用ES5将特定分类格式字符串转换为指定结构的JS对象
实现方案
实现思路
- 先按
.将字符串拆分为多个独立分类规则片段,过滤空片段避免异常 - 每个规则片段按
:拆分为名称段和分类值段 - 分类值段按空格拆分取最后一个元素,适配第二种输入里分类值前有多余描述的场景
- 名称段按空格拆分得到所有待映射的名称,逐个赋值到结果对象即可
ES5 实现代码
function strToCategoryObj(str) { var result = {}; var ruleGroups = str.split('.'); var i, j, group, parts, nameStr, categoryStr, category, names, curName; for (i = 0; i < ruleGroups.length; i++) { group = ruleGroups[i].trim(); if (!group) continue; parts = group.split(':'); if (parts.length < 2) continue; // 处理分类值:取末尾有效分类 nameStr = parts[0].trim(); categoryStr = parts[1].trim(); category = categoryStr.split(' ').pop(); // 处理多个名称映射同一个分类 names = nameStr.split(' '); for (j = 0; j < names.length; j++) { curName = names[j].trim(); if (curName) { result[curName] = category; } } } return result; }
调用示例
// 测试第一种输入 var str1 = "Apple Banana Kiwi Orange: fruit. Tomato: vegetable"; console.log(strToCategoryObj(str1)); // 输出:{ Apple: 'fruit', Banana: 'fruit', Kiwi: 'fruit', Orange: 'fruit', Tomato: 'vegetable' } // 测试第二种输入 var str2 = "Tomato: maybe a fruit. Apple Banana Orange: fruit. Carrots: vegetable"; console.log(strToCategoryObj(str2)); // 输出:{ Tomato: 'fruit', Apple: 'fruit', Banana: 'fruit', Orange: 'fruit', Carrots: 'vegetable' }
方案说明
你之前用split加嵌套for循环的思路是完全正确的,该方案的时间复杂度为O(N)(N为字符串内单词总数),固定两层循环没有额外性能损耗,可读性和兼容性都优于正则实现,属于最优的解决方案。
内容的提问来源于stack exchange,提问作者Ndx
相关产品推荐
相关产品推荐

