将逗号分隔字符串拆分至对象新属性的技术实现问题
解决逗号分隔邮箱列表的对象转换问题
我来帮你搞定这个问题——你的需求是把带有逗号分隔邮箱项的对象,转换成每个属性对应单个邮箱、索引连续的新对象,而且因为系统限制不能用ES6语法,对吧?
先说说你原有代码的问题
你写的这段代码:
var listSplt = ''; for(key in emailList){ listSplt += emailList[key].split(','); }
有两个核心问题:
- 错误的类型处理:
split(',')返回的是数组,直接和字符串listSplt拼接时,数组会被自动转成逗号分隔的字符串(比如["email-2","email-3"].toString()会变成"email-2,email-3"),最终你得到的是一个长字符串,完全不是需要的对象结构。 - 没有拆分到单个邮箱项:你只是把整个拆分后的数组的字符串形式拼在一起,没有遍历每个单独的邮箱来构建目标对象。
符合需求的ES5兼容解决方案
下面是完全用ES5语法实现的代码,能精准得到你想要的结果:
// 你的原始邮箱对象 var emailList = { 0: "email-1@site.com", 1: "email-2@site.com,email-3@site.com,email-4@site.com,email-5@site.com", 2: "email-6@site.com", 3: "email-7@site.com,email-8@site.com" }; // 初始化结果对象和索引计数器 var formattedEmailList = {}; var currentKey = 0; // 遍历原始对象的每个属性 for (var key in emailList) { // 重要:只处理对象自身的属性,避免遍历原型链上的冗余属性 if (emailList.hasOwnProperty(key)) { // 拆分当前属性值为单个邮箱的数组 var individualEmails = emailList[key].split(','); // 遍历每个拆分后的邮箱 for (var i = 0; i < individualEmails.length; i++) { // 将邮箱存入结果对象,使用连续的数字索引 formattedEmailList[currentKey] = individualEmails[i]; // 索引自增,保证下一个邮箱用新的连续key currentKey++; } } } // 输出结果就是你想要的结构 console.log(formattedEmailList);
代码逻辑解释
- 初始化:
formattedEmailList用来存储最终的目标对象,currentKey作为连续索引的计数器,从0开始。 - 安全遍历:用
for...in遍历原始对象时,加上hasOwnProperty(key)判断是ES5时代的最佳实践,防止意外遍历到对象原型链上的属性。 - 拆分与赋值:对每个属性值执行
split(',')得到单个邮箱的数组,再通过嵌套循环把每个邮箱依次存入结果对象,每存入一个就把currentKey加1,确保索引是连续的0、1、2...
运行这段代码后,你就能得到完全符合预期的formattedEmailList对象啦。
内容的提问来源于stack exchange,提问作者Cody Smith
相关产品推荐
相关产品推荐

