我一般是Vue
和JS
的新手。考虑一个对象数组,每个对象都有一个“名称”-实际上是一些进程/ cmd,例如:
/disks/tools/itools/odor/src/bin/lib/script.py -path /disks/tools/itools/ps/char/leno/tool/src/work/dir -i ./report/dir/bin/a -report -id 12345 --name my_/name
我编写了以下代码,获取该数组,对其进行迭代,并为每个数组添加一个简短版本。因此,对于上面的示例,我们得到:
script.py -path dir -i a -report -id 12345 --name my_/name
意思是,每个包含“路径”的子字符串都将转换为一个小字符串。 (我认为我们可以通过查看子字符串的第一个符号来捕获所有情况-如果它是/
或./
,那么我们应该使用基本名称。)
我的代码:
addShort: function(arr) {
for (var i of arr) {
if (i.name) {
i.fullname = i.name;
i.name = '';
var splitedArr = i.fullname.split(' ');
for (var path of splitedArr) {
i.name += this.basename(path);
}
}
}
},
basename: function(str) {
var nStr = str.replace(/^.*[\\\/]/, '');
if (newStr) {
return newStr + ' ';
}
return '';
}
由于我是Vue
和JS
的新手,因此我对此段代码感到怀疑。我觉得它可以写得更干净,更漂亮,其次,我不确定我的正则表达式是否可以捕获所有需要的情况。另外,我注意到每个字符串最后都有多余的空格,因此我想将basename
函数更改为:
basename: function(str) {
var nStr = str.replace(/^.*[\\\/]/, '');
return newStr | '';
}
并为i.name += this.basename(path);
添加空间,因此将类似于:i.name += this.basename(path).' ';
。但这会在最后保留额外的空间-是否有一种方法可以让我们进入循环的最后一次迭代,以便不添加空间?
很抱歉使您浪费时间对我的怀疑。
答案 0 :(得分:0)
这是一个较短的方法:
i.name = i.fullname
.split(/\s+/)
.map(arg => this.basename(arg))
.join(' ');
basename
函数也可以简化为:
basename(str) {
// Will take the basename of strings that start in a / or ./ only
return str.replace(/^\.?\/.*[\\\/]/, '');
}
我认为我们可以通过查看子字符串的第一个符号来捕获所有情况-如果它是
/
或./
,那么我们应该使用基本名称
请记住相对路径也可以是这样的:
path/to/file.txt
还请注意,不要创建i.fullname
属性(该属性应该已经存在于i
对象中),否则它不会是被动的(如果要在模板中呈现它) )。
答案 1 :(得分:-1)
我想补充一点,单元测试是我在新领域工作时放心的主要方式。进行一些简单的单元测试,不必花哨的东西就可以帮助您明确地说出编写的函数按预期工作。 js有多种出色的单元测试框架(即Jest或Jasmine)。
此外,如果您很难在每种情况下使用正则表达式,我建议使用this regex site,因为它的快速参考面板位于左下角,它准确描述了可以选择的正则表达式字符选项来自。