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

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

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

最佳答案

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

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

关于javascript - 如何将字符串添加到列表中而不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57971450/

相关文章:

javascript - 使用 Chrome 在本地 Canvas 上绘制图像

javascript - 如何正确地对按钮点击进行 Jasmine 测试

javascript - 如何模拟点击Mapbox markerLayer

angular - 有没有办法以 Angular 阻止路径?

angular - Kendo Angular 2折线图,需要系列项目内类别轴的索引

typescript - 根据实现解析泛型

javascript - 正则表达式,仅作品之间有空格

reactjs - 如何在 momentjs 中获取 endOf day toISOString() 但毫秒应该是 .000Z 而不是 .999Z

CSS:如何让文本占据一个容器的 100% 并尊重另一个容器的高度?

node.js - tsc 错误 TS1110 node.d.ts Node.js v6.x