Tengo esta matriz: -
var a = ['DL1,C1,C5,C6','M4,DL3-7,B1-5']
Y quiero dividirlos como
[DL1,C1,C5,C6,M4,DL3,DL4,DL5,DL6,DL7,B1,B2,B3,B4,B5]
Para que DL3-7 o DL3-DL7 este Split DL3,DL4,DL5,DL6,DL7
La razón por la que estoy haciendo esto es porque quiero bloquear la entrada duplicada como DL3 no debería venir en ningún otro lado, estoy tratando de que los bucles hagan esto, solo quiero saber si hay alguna forma más simple de hacerlo y verificar si hay duplicación. después.
Gracias
Tienes que dividir tus problemas en tres partes:
"DL3-7" a "DL3", "DL4"...Una vez que analiza el problema, es mucho más fácil manejarlos uno por uno. El código es bastante legible, avíseme si hay algo difícil de entender.
const a = ['DL1,C1,C5,C6', 'M4,DL3-7,B1-5'] //this will split all comma delimited values const commaDelimit = a.map(item => item.split(',')).flat(); console.log("Separate values by comma: ") console.log(commaDelimit); //this will turn the ranges into individual items //this does not account for if the number is bigger than 9. //you can try doing this part yourself if you need to, should be a good learning exercise. const resolveRange = commaDelimit.map(item => { if (item.includes('-')) { const pos = item.indexOf('-'); const beginning = Number(item.charAt(pos - 1)); const end = Number(item.charAt(pos + 1)) + 1; const toReturn = []; const prependString = item.substring(0, pos - 1); for (let i = beginning; i < end; i++) { toReturn.push(`${prependString}${i}`) } return toReturn; } return item; }).flat(); console.log("Change 'DL3-7' to DL3, DL4 and so on: ") console.log(resolveRange); //this will get rid of duplicates const uniques = [...new Set(resolveRange)]; console.log("Remove duplicates: ") console.log(uniques);Cree una matriz con esa longitud, itere y transforme, acabo de escribir la parte más desafiante:
function splitRange(range) { let a = range.split('-'); if (a.length < 2) return [range]; const baseString = (a[0].match(/[az AZ]/g))?.join(''); const baseNumber = +((a[0].match(/\d+/))?.shift()); return Array.from({length: +a.pop().match(/\d+/) - baseNumber + 1}).map((_,i)=>`${baseString}${i+baseNumber}`); } const s='DL1,C1,C5,C6,M4,DL3-7,B1-5'; console.log( s.split(',').map(item=>splitRange(item)).flat() );Básicamente, @cSharp ha explicado el concepto de transformación de datos al resultado deseado.
Dividir por coma.
Trabaje con expresiones regulares para transformar el valor del rango y agregarlo a la matriz. Patrón Regex y datos de prueba
Distinguir el valor de la matriz.
var a = [' DL1,C1,C5,C6','M4,DL3-7,B1-5']; var formatteds = a.reduce((previous, current) => { var splits = current.trim().split(','); var rangedSplits = splits.reduce((prev, cur) => { var pattern = new RegExp(/([AZ]*)(\d)-[AZ]*(\d)/); var match = pattern.exec(cur); if (match) { // Pattern 1: ['DL3-7', 'DL', '3', '7'] // Pattern 2: ['DL3-DL7', 'DL', '3', '7'] var startIndex = parseInt(match[2].toString()); var endIndex = parseInt(match[3].toString()); var arr = []; for (let i = startIndex; i <= endIndex; i++) { arr.push(match[1].toString() + i); } prev = prev.concat(arr); } else { prev = prev.concat([cur]); } return prev; }, []); previous = previous.concat(rangedSplits); return previous; }, []); var result = formatteds.filter((x, i, array) => array.indexOf(x) === i); console.log(result);