为何JS脚本生成的TSV首列值前会附加undefined?
问题根源与修复方案
问题原因
你的代码里arr[i] += fullname + '\t' + email + '\t' + commitsnum;这行是问题所在。因为你初始化的arr是空数组,循环中第一次访问arr[i]时,它的默认值是undefined,用+=拼接就会把undefined和后面的内容连在一起,直接导致每一行首列前多了这个无效字符串。
简单修复方案
把arr[i] += ...改成直接赋值:
arr[i] = fullname + '\t' + email + '\t' + commitsnum;
更简洁的优化(去掉多余数组)
其实arr在这里完全是多余的,可以直接把拼接后的内容加到strings里,省去数组中转:
javascript:(function(){ var i, commitsemail, commitsnum, email, fullname; var regexnum = /.+?(?=commits)/g; var regexemail = /(?<=\().*(?=\))/g; var glab = document.querySelectorAll('div.col-lg-6.col-12.gl-my-5'); var strings='Full name'+'\t'+'Email'+'\t'+'# of commits'+'\r\n'; var endurl = document.URL.split(/[/]+/).pop(); if (endurl != 'master') { alert('You are not on the contributors page of a Gitlab repo. Press Esc key, go to URL ending with /master and re-run this bookmarklet'); } else { for (i = 0; i<glab.length; i++) { fullname = glab[i].getElementsByTagName('h4')[0].textContent; commitsemail = glab[i].getElementsByTagName('p')[0].textContent; commitsnum = [...commitsemail.match(regexnum)]; email = [...commitsemail.match(regexemail)]; // 直接拼接进strings,不用数组中转 strings += fullname + '\t' + email + '\t' + commitsnum + '\r\n'; } var pom = document.createElement('a'); var csvContent = strings; var blob = new Blob([csvContent],{type: 'text/tsv;charset=utf-8;'}); var url = URL.createObjectURL(blob); pom.href = url; pom.setAttribute('download','gitlab-contributors.tsv'); pom.click(); } })();
通用注意事项
这个问题属于未初始化变量拼接的典型场景,你其他同类脚本如果也出现undefined前缀,大概率也是用了+=去给未初始化的数组元素/变量赋值,只要把+=改成直接赋值=,或者提前把变量/数组元素初始化为空字符串(比如arr[i] = '';再用+=)就能解决。
内容的提问来源于stack exchange,提问作者Glenn Gutmacher
相关产品推荐
相关产品推荐

