después de trabajar en esto durante muchas horas, no sé cómo resolver el siguiente problema. Ofrezca soluciones con explicaciones o sugerencias para mejorar mi solución.
/* instructions Given a word and an array of string skeletons, return an array of all of the skeletons that could be turned into the word by replacing the '-' with letters. If there are no possible matches return an empty string example: given the word 'hello' 'he---' would be a match, 'h--l' or 'g-llo' would not be a match */ // example test case: let word = 'hello'; let skeletons = ['h--l', 'he---', 'g-llo', 'm-llo', '--llo', 'hl--']; function findSkels(word, skeleton){ let goodSkels = []; skeleton = skeletons.filter(w => w.length === word.length); console.log(skeletons) for(let sw = 0; sw < skeletons.length; sw++){ let possibleMatch = true; for(let letter = 0; letter < word.length; letter++){ if(word[letter] !== skeletons[sw][letter] || skeletons[sw][letter] == '-'){ possibleMatch = false } } if(possibleMatch){ goodSkels.push(skeletons[sw]) } } return goodSkels; }Estás cerca, pero
if (word[letter] !== skeletons[sw][letter] || skeletons[sw][letter] == '-') { possibleMatch = false } descalificará un esqueleto si alguna letra no coincide o si la letra es - . Así que esto descalificará cualquier palabra que no sea una coincidencia exacta. En su lugar, desea && : descalificar solo si la letra no coincide y la letra no es un - .
/* instructions Given a word and an array of string skeletons, return an array of all of the skeletons that could be turned into the word by replacing the '-' with letters. If there are no possible matches return an empty string example: given the word 'hello' 'he---' would be a match, 'h--l' or 'g-llo' would not be a match */ // example test case: let word = 'hello'; let skeletons = ['h--l', 'he---', 'g-llo', 'm-llo', '--llo', 'hl--']; function findSkels(word, skeleton) { let goodSkels = []; skeleton = skeletons.filter(w => w.length === word.length); for (let sw = 0; sw < skeletons.length; sw++) { let possibleMatch = true; for (let letter = 0; letter < word.length; letter++) { if (word[letter] !== skeletons[sw][letter] && skeletons[sw][letter] !== '-') { possibleMatch = false } } if (possibleMatch) { goodSkels.push(skeletons[sw]) } } return goodSkels; } console.log(findSkels(word, skeletons));O, refactorizado para verse mejor:
const word = 'hello'; const skeletons = ['h--l', 'he---', 'g-llo', 'm-llo', '--llo', 'hl--']; const findSkels = (word, skeletons) => skeletons .filter(skel => ( skel.length === word.length && [...skel].every((char, i) => char === '-' || char === word[i]) )); console.log(findSkels(word, skeletons)); Los métodos de matriz son a menudo una buena manera de hacer que el código sea mucho más limpio que los bucles for imperativos basados en índices. Si en realidad no le importa el índice, solo el valor que se itera, a menudo puede deshacerse del for (let i = construya por completo, y use un método de matriz o for..of.