javascript - 如何向列表添加字符串而不重复
我不知道在添加变量之前如何检查我的变量或它的重复是否已经在列表中。
让我们举一个列表的例子:
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)”。
如果有人能帮我把这个付诸实践,谢谢。
答案#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);答案#2
你可以尝试类似这样的东西
- 从传递的值中获取要添加的键,
- 反转列表并找到匹配键的第一次出现
- 从 key 中获取数字,如果存在数字则加 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)