Estoy tratando de escribir una función que acepte una matriz de cadenas como argumento. Quiero devolver la matriz de cadenas ordenadas primero por número de vocales y luego alfabéticamente.
Entrada : ['perro', 'gato', 'elefante', 'hipopótamo', 'cabra'] Salida : ['gato', 'perro', 'cabra', 'hipopótamo', 'elefante']
function vowelMatching(vowels) { return vowels.match(/[aeiou]/ig) || []; //The 'i' in regex accounts for capitals } function arrangeByVowels(array) { const outputArray = []; console.log(array.length) console.log(outputArray.length) for(let x=0; array.length === outputArray.length; x++) { // let x = 0 const filterArray = []; for(let i =0; i<array.length; i++) { //console.log(vowelMatching(array[i]).length) if (vowelMatching(array[i]).length === x) { filterArray.push(array[i]) } } //console.log(filterArray.sort()) outputArray.push(...filterArray.sort()) } return outputArray } console.log(arrangeByVowels(['dog', 'gAg', 'qq', 'cat', 'elephant', 'hippo', 'goat'])) Estoy usando un bucle for anidado para lograr esto. Si asigno un valor a x , por ejemplo let x = 1 y comento el bucle for externo, devolverá todas las palabras con 1 vocal en orden alfabético. (Este es el resultado que busco)
Quiero recorrer x hasta array.length === outputArray.length pero en este momento este código devuelve una matriz vacía, y no estoy seguro de por qué.
Creo que estoy cerca, pero no tengo idea de dónde me estoy equivocando. ¿Qué estoy haciendo mal?
Como respuesta de seguimiento a su pregunta real....
El problema es la lógica en su bucle for inicial
for(let x=0; array.length === outputArray.length; x++)Su condición array.length === outputArray.length siempre devolverá inicialmente falso ya que su matriz de salida tiene una longitud diferente a su matriz inicial. Esto finalizará instantáneamente el ciclo for porque la condición para continuar la iteración ha fallado.
El ciclo for es esencialmente mientras (la condición es verdadera) incrementa x; Su condición comienza falsa.
para corregirlo, simplemente cambie la condición para que siempre sea verdadera hasta que se cumplan sus criterios:
for(let x=0; outputArray.length < array.length; x++) function vowelMatching(vowels) { return vowels.match(/[aeiou]/ig) || []; } function arrangeByVowels(array) { const outputArray = []; for(let x=0; outputArray.length < array.length; x++) { // Logic error was here. const filterArray = []; for(let i =0; i<array.length; i++) { if (vowelMatching(array[i]).length === x) { filterArray.push(array[i]) } } outputArray.push(...filterArray.sort()) } return outputArray } console.log(arrangeByVowels(['dog', 'gAg', 'porcupine', 'qq', 'alligator', 'cat', 'elephant', 'albatross', 'hippo', 'goat', 'potato', 'banana','aardvark' ]))Esto se puede hacer en un solo .sort();
let source = ['dog', 'gAg', 'qq', 'cat', 'elephant', 'hippo', 'goat', 'arose', 'unity', 'arise'] let result = source.sort((a,b) => { let aVowels = a.match(/[aeiou]/gi) || []; let bVowels = b.match(/[aeiou]/gi) || []; return aVowels.length === bVowels.length ? (a > b ? 1 : -1) : // same number of vowels so compare alphabetically (aVowels.length > bVowels.length ? 1 : -1) // different number of vowels so compare lengths }) console.log(result);