JS/jQuery创建对象时生成undefined值的问题排查
问题原因分析
- 赋值时机错误:你将
object[row[1]] = { namn: row[2] }逻辑写在了每次正则匹配命中的分支内,没有等整行所有匹配项都解析完成就执行赋值,此时row数组元素还没有填充完整。 - 中间态访问不存在的数组索引:以解析
#DIM 1 "test"行为例,三次正则匹配的过程如下:- 第一次匹配到
#DIM,push后row值为['#DIM'],此时访问row[1]、row[2]均为undefined,直接给object新增了key为undefined、namn为undefined的异常项 - 第二次匹配到
1,push后row值为['#DIM', '1'],此时访问row[2]仍为undefined,给object的key1赋值的namn为undefined - 第三次匹配到
test,push后row值为['#DIM', '1', 'test'],此时赋值才正确,key1的namn会被覆盖为test
- 第一次匹配到
- 最终输出中残留的undefined项,就是第一次匹配生成的异常key,后续没有被覆盖所以保留了下来。
修复方案
把赋值逻辑挪到do-while循环外部,等整行所有内容解析完成、row数组填充完整之后再执行赋值,修改后的代码如下:
jQuery(document).ready(function() { console.log("ok"); var object = {}; var text = `#DATA1 1000 #DATA2 1000 #DATA3 2000 #DIM 1 "test" #DIM 6 "test2"`; var lines = text.split('\n'); for (var line = 0; line < lines.length; line++) { if (lines[line].startsWith("#DIM")) { var myRegexp = /[^\s"]+|"([^"]*)"/gi; var row = []; do { var match = myRegexp.exec(lines[line]); if (match != null) { row.push(match[1] ? match[1] : match[0]); } } while (match != null); // 整行解析完成后再执行赋值 object[row[1]] = { namn: row[2] }; } } console.log(object); });
内容的提问来源于stack exchange,提问作者Kevin Lindmark
相关产品推荐
相关产品推荐

