在添加变量之前,我不知道如何检查变量或其重复项是否已在列表中。
让我们以一个列表为例:
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)”。
如果有人可以帮助我将其付诸实践,谢谢。
答案 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)
您可以尝试这样的事情
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)