Recientemente participé en un desafío de algoritmos para crear una búsqueda difusa con los siguientes criterios:
Dada una matriz establecida, cree una función que reciba un argumento y devuelva una nueva matriz que contenga solo los valores que comienzan con:
A) El argumento proporcionado B) El argumento proporcionado pero con 1 diferencia (es decir, 1 letra incorrecta)
La matriz era: frutas = [manzana, albaricoque, plátano, pera, mango, cereza, tomate]
asi que:
Esta es la solución que se me ocurrió:
const fruits = ['apple', 'apricot', 'banana', 'pear', 'mango', 'cherry', 'tomato'] function fuzzySearch(str) { return fruits.filter(fruit => { let letterCount = 0 const fruitLetArr = fruit.toLowerCase().split('') const strArr = str.toLowerCase().split('') for (var i = 0; i < strArr.length; i++) { console.log(fruitLetArr[i], strArr[i], i, letterCount) if (fruitLetArr[i] !== strArr[i]) letterCount++ if (letterCount === 2) break; } if (letterCount < 2) return true }); } fuzzySearch(str)¿Alguien puede pensar en una forma más rápida que no implique iterar sobre cada valor antes de que se pueda encontrar una solución?
Aquí hay algo que debería ser un poco más eficiente. También más fácil de leer. En esta solución, asumo que por "diferencia" te refieres a la sustitución de una letra por otra letra, en lugar de la adición de otra letra.
const fruits = ['apple', 'apricot', 'banana', 'pear', 'mango', 'cherry', 'tomato']; const fuzzySearch = (str) => { return fruits.filter((fruit) => { // If our first case is met, immediately return if (fruit.startsWith(str)) return true; // Split the fruit based on the length of input string const test = fruit.slice(0, str.length).split(''); let diffs = 0; // Compare + keep track of differences between input + sliced fruit test.forEach((letter, i) => letter !== str[i] && diffs++); // If we have more than one difference, it doesn't meet case #2 if (diffs > 1) return false; return true; }); }; const testCases = ['ap', 'app', 'appl', 'pan', 'bp']; for (const testCase of testCases) { console.log(fuzzySearch(testCase)); }