【问题标题】:How to add a string to a list without duplicates如何将字符串添加到列表中而不重复
【发布时间】:2020-01-18 03:40:03
【问题描述】:

我不知道如何在添加之前检查我的变量或其重复项是否已经在列表中。

我们以列表为例:

LIST = ['TestA', 'TestB', 'TestC (AZE)', 'TestB (#2)']

  • 如果我想添加“TestA”,则添加“TestA (#2)”。

  • 如果我想添加 'TestB' 或 'TestB (#X)',其中 X 是任意数字, 然后我添加“TestB (#3)”,因为已经存在重复项,并且重复项的编号为 3

  • 如果我想添加“TestC (AZE)”,则添加“TestC (AZE) (#2)”。

我开始这样做了:

VARIABLE = "TestB"

if(this.LIST.includes(VARIABLE)) {
    this.LIST.push(VARIABLE + " (#2)");
} else {
    this.LIST.push(VARIABLE);
}

问题是如果我多次添加“TestB”,就会添加几个“TestB (#2)”。

如果有人能帮我把它付诸实践,谢谢。

【问题讨论】:

    标签: javascript angular typescript list duplicates


    【解决方案1】:

    使用另一个对象来记录到目前为止每个字符串出现的次数:

    LIST = [];
    
    const counts = {};
    function addToList(item) {
      counts[item] = (counts[item] || 0) + 1;
      LIST.push(item + (counts[item] === 1 ? '' : ' (#' + counts[item] + ')'));
    }
    
    addToList('foo');
    addToList('foo');
    addToList('bar');
    addToList('baz');
    addToList('bar');
    addToList('foo');
    console.log(LIST);

    要么确保addToList 不使用(# 后缀调用,要么先去掉(# 后缀,例如:

    LIST = [];
    
    const counts = {};
    function addToList(item) {
      const trailingMatch = item.match(/ \(#\d+\)$/);
      if (trailingMatch) {
        item = item.slice(0, item.length - trailingMatch[0].length);
      }
      counts[item] = (counts[item] || 0) + 1;
      LIST.push(item + (counts[item] === 1 ? '' : ' (#' + counts[item] + ')'));
    }
    
    addToList('foo');
    addToList('foo');
    addToList('bar');
    addToList('baz');
    addToList('bar');
    addToList('foo');
    addToList('foo (#2)');
    console.log(LIST);

    【讨论】:

    • 但是如果我添加“foo (#2)”就会有重复
    • 当传递一个项目给addToList时,总是传递它没有数字后缀 - 让addToList来处理它。
    • 在我的情况下,变量来自输入,用户可能使用后缀,我会看看我是否可以在输入上使用正则表达式验证器
    • 很简单,只需要/ \(#\d+\)$/,如果有匹配就切掉
    【解决方案2】:

    你可以试试这样的

    • 从传递的值中获取要添加的键,
    • 反转列表并找到匹配键的第一个匹配项
    • 从键中取出数字,如果数字存在则加1,否则设置为2
    • 如果找不到键,则将值本身添加到列表中

    let LIST = ['TestA', 'TestB', 'TestC (AZE)', 'TestB (#2)']
    
    let adder = (val) => {
      let key = val.replace(/^(.*)\(#\d+\)$/g, '$1').trim()
      let findValue = [...LIST].reverse().find(v => v.includes(key))
      if (findValue) {
        let [_, digit] = (findValue.match(/^.*\s\(#(\d+)\)/) || [0, 0])
        if (digit) {
          LIST.push(key + ` (#${+digit+1})`)
        } else {
          LIST.push(key + ` (#${2})`)
        }
      } else {
        LIST.push(val)
      }
    }
    
    adder("TestA")
    console.log(LIST)
    
    adder("TestC (AZE)")
    console.log(LIST)
    
    adder("TestZ")
    console.log(LIST)
    
    adder("TestRandom (23)")
    console.log(LIST)
    
    adder("TestRandom (23)")
    console.log(LIST)

    【讨论】:

    • @Quentin 无后顾之忧,总是乐于提供帮助 :)
    猜你喜欢
    • 2021-06-15
    • 1970-01-01
    • 2020-09-14
    • 2018-12-13
    • 1970-01-01
    • 2022-06-12
    • 2022-07-28
    • 1970-01-01
    • 2014-09-30
    相关资源
    最近更新 更多