在Angular 6中,从数组列表中删除每个元素开头/结尾的"."和","。

5

我在Angular中有一个响应式表单,它以文本输入形式获取文件格式。

<input type="text" name="formats" formControlName= "formats">

例如: .txt、.zip、.tar.gz

我需要将这些输入转换为数组列表。在@danday74的帮助下,我可以做到这一点。以下是代码:

const input = ".txt, .zip, .tar.gz"

const parts = input.split(' ')

const output = parts.map(x => x.replace(',', '').replace('.', ''))

console.log(output)

代码生成的输出是["txt","zip","tar.gz"],这正是我所期望的。
然而,我的担忧是,如果用户输入像这样的内容.. ., .tar.gf.ds ,.tar或者tar tar.gz zip,那么输出将分别是[".","","tar.gf.ds","tar"]["tar","targz","zip"]
我的问题是,我该如何实现这样一种方式,使得用户可以输入文件格式而不需要特定的结构(例如:.txt, .zip, .tar.gz,.txt .zip .tar.gz, txt, zip, tar.gz, txt zip tar.gz),并且我应该能够生成这样的输出["txt","zip","tar.gz"]。即我应该能够忽略输入中的...,,只考虑有字符串的输入。

2
这个问题并不特别针对Angular。如果你把问题聚焦在处理数组的JavaScript上,你可能会得到更多答案。 - Todd Palmer
你好,我的朋友Navaneeth,你已经有了一些答案 - 如果你卡住了,在这里留下评论,我会帮你看看。 - danday74
2个回答

2

以下是一种通用的方法,您可以这样做!

如果字符串中有两个 ..,则不要添加。

可能有一些使用案例被遗漏了,请在评论中提出。

var strings = [
  ".txt, .zip, .tar.gz",
  "..txt .zip .tar.gz a.b.should.be.in", 
  "txt, zip, tar.gz",
  ".., ..., ...., .this.should.be.in, .not..this"
]

var extensions = []

strings
  .forEach((item) => {
    let items = item.split(',');
    if (items.length <= 1) {
      items = item.split(' ');
    }
    items.forEach(ext => {
      const trimedExt = ext.trim()
      if (
        trimedExt.indexOf('..') === -1
      ) {
        if (trimedExt[0] === '.') {
          extensions.push(trimedExt.substr(1))
        } else {
          extensions.push(trimedExt)
        }        
      }
    });
  })
  
 console.log(extensions)


二次时间复杂度,为什么现在? - Aderemi Dayo
@AderemiDayo 外层循环只是输入数据。如果将内层循环制作成一个函数,并仅使用输入数据进行调用,那么它看起来就像是线性时间复杂度的解决方案。 - Prasanna
@Prasanna 感谢您的建议。非常感激! - Navaneeth Selvaraj

2

如果你只关心引导符号.,,你可以使用以下正则表达式:

const input = '.txt, .zip, .tar.gz, ,.tar, txt, zip, tar.gz, .., .,'

const output = input.split(', ')
  .map(ext => ext.replace(/^\W+/, '')) // remove any character that's not a word character from the beginning of each string
  .filter(Boolean); // filter just to remove empty strings

console.log(output);

如果你也需要删除末尾的字符,你可以修改正则表达式以从末尾删除它们:

const input = '.txt, .zip, .tar.gz, ,.tar, txt, zip, tar.gz, .txt., .tar.gz., ,.tar,., .., .,'

const output = input.split(' ') // split on space character as trailing commas will be handled in the regex
  .map(ext => ext.replace(/^\W+|\W+$/g, ''))
  .filter(Boolean);

console.log(output);

如果有其他需要考虑的问题,请告诉我。


我使用了input.split(' ')而不是input.split(', '),因为ext.replace(/^\W+|\W+$/g, ''))将会移除逗号。所以它可以处理像这样的输入:txt zip tar.gz - Navaneeth Selvaraj
谢谢,我已经编辑了答案以反映该用例。 - Scott Rudiger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接