/** * Duplicates a name with respect to a collection of existing names * e.g. * name all names result * ------ ----------- -------- * ("foo") ["foo"] "foo (1)" * ("foo") ["foo", "foo (1)"] "foo (2)" * ("foo (1)") ["foo", "foo (1)"] "foo (2)" * ("foo") ["foo", "foo (2)"] "foo (1)" * * Repl */ export const duplicateName = (name, allNames) => { const baseName = name.split(" (")[0] const isDuplicate = new RegExp(`${baseName}\\s\\((\\d+)\\)$`) // get the sequence from matched names const sequence = [] allNames.filter(n => { if (n === baseName) { return true } const match = n.match(isDuplicate) if (match) { sequence.push(parseInt(match[1])) return true } return false }) sequence.sort((a, b) => a - b) // get the next number in the sequence let number if (sequence.length === 0) { number = 1 } else { // get the next number in the sequence for (let i = 0; i < sequence.length; i++) { if (sequence[i] !== i + 1) { number = i + 1 break } } if (!number) { number = sequence.length + 1 } } return `${baseName} (${number})` }