获取字符串中每个子路径的基本名称

时间:2019-02-20 20:38:17

标签: javascript vue.js

我一般是VueJS的新手。考虑一个对象数组,每个对象都有一个“名称”-实际上是一些进程/ 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 '';
}

由于我是VueJS的新手,因此我对此段代码感到怀疑。我觉得它可以写得更干净,更漂亮,其次,我不确定我的正则表达式是否可以捕获所有需要的情况。另外,我注意到每个字符串最后都有多余的空格,因此我想将basename函数更改为:

basename: function(str) {
    var nStr = str.replace(/^.*[\\\/]/, '');
    return newStr | '';
}

并为i.name += this.basename(path);添加空间,因此将类似于:i.name += this.basename(path).' ';。但这会在最后保留额外的空间-是否有一种方法可以让我们进入循环的最后一次迭代,以便不添加空间?

很抱歉使您浪费时间对我的怀疑。

2 个答案:

答案 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,因为它的快速参考面板位于左下角,它准确描述了可以选择的正则表达式字符选项来自。