如何将字符串添加到列表中而不重复

时间:2019-09-17 09:36:46

标签: javascript angular typescript list duplicates

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

让我们以一个列表为例:

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)”。

如果有人可以帮助我将其付诸实践,谢谢。

2 个答案:

答案 0 :(得分:3)

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

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);

答案 1 :(得分:1)

您可以尝试这样的事情

  • 从传递的值中获取要添加的键,
  • 反转列表并找到匹配键的第一个匹配项
  • 获取密钥中的数字,如果存在数字,则向其添加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)