Estoy trabajando en javascript y tratando de encontrar un algoritmo para agregar números incrementales a las cadenas, en función de las cadenas existentes en el programa.
Aporte:
['Untitled Form', 'Untitled Form - 1', 'Untitled Form - 5', 'Untitled Form - 3', 'Untitled Form - 4', "Untitled Form"];Supongamos que el usuario desea agregar otra cadena a esta lista y ha seleccionado "Formulario sin título" como la cadena para agregar. Entonces, dada la entrada y la lista existente, el algoritmo buscaría en la lista para verificar si falta algún número incremental, por ejemplo, en el código anterior falta el "Formulario sin título - 2", debería devolver "Formulario sin título - 2" como la nueva cadena a agregar.
Producción:
['Untitled Form', 'Untitled Form - 1', 'Untitled Form - 5', 'Untitled Form - 3', 'Untitled Form - 4', "Untitled Form - 2"];Es la misma función que en el Explorador de Windows, donde sigue agregando nuevas carpetas ("Nueva carpeta (1)", "Nueva carpeta (2)" y así sucesivamente)
Tengo una solución para este problema, pero creo que no es muy eficiente y el algoritmo también busca el número más alto y agrega el número incremental después de eso es "Formulario sin título - 6".
Puede hacerlo extrayendo los indexes existentes y ordenándolos, luego compare cada índice con el siguiente, si la diferencia es mayor que 1 , para que pueda darse cuenta de que hay un índice perdido en ese lugar. Así:
let list = ['Untitled Form', 'Untitled Form - 1', 'Untitled Form - 5', 'Untitled Form - 3', 'Untitled Form - 4']; const findNextIndex = (arr)=> { const sortedArr = arr.map(item => Number(item.split('-')[1] || 0)).sort((a,b)=> ab); if(!sortedArr.includes(0)) return 0; let index = sortedArr[sortedArr.length-1] + 1; //maximum value for(let i =0; i< sortedArr.length; i++){ if(sortedArr[i+1] - sortedArr[i] > 1){ index = sortedArr[i] + 1; break; } } return index; } const nextIndex = findNextIndex(list); list = [...list, `Untitled Form${nextIndex ? ` - ${nextIndex}` : ''}`] console.log(list)Esto debería funcionar
[ [0] => 'Untitled Form', [1] => 'Untitled Form - 1', [2] => 'Untitled Form - 2', .... ]recorre y findIndex que indexInTitle no coincide con el índice de la matriz.
Si lo encuentra, devuelva ese índice; si no, índice incremental,
const listMissing2 = ['Untitled Form', 'Untitled Form - 1', 'Untitled Form - 5', 'Untitled Form - 3', 'Untitled Form - 4']; const listNotMissing = ['Untitled Form', 'Untitled Form - 1', 'Untitled Form - 5', 'Untitled Form - 3', 'Untitled Form - 4', 'Untitled Form - 2']; const findMissingOrIncrementIndex = list => { const sortedList = list.sort(); const missingIndex = sortedList.findIndex((title, index) => { const [, indexInTitle] = title.split(' - '); return index > 0 && Number(indexInTitle) !== index; }); return (missingIndex > -1) ? missingIndex : list.length; } console.log(findMissingOrIncrementIndex(listMissing2)); console.log(findMissingOrIncrementIndex(listNotMissing));