Estoy construyendo una API que necesita encontrar la ruta más larga que coincida con un número de una manera muy eficaz.
p.ej
// API Request { 'number': '123456789' } // DATA [ { 'prefix': '1', 'price': 30.5 }, { 'prefix': '123', 'price': 10.5 }, { 'prefix': '12345', 'price': 22.5 }, ] // API RESPONSE { 'prefix': '12345', 'price': 22.5 },Como puede ver arriba, la respuesta debe ser la fila con el prefijo 12345, ya que es la más larga. por favor necesito un poco de ayuda para hacer esto. Pasé aproximadamente 2 días buscando una solución, así que decidí venir a Stack Overflow para obtener respuestas. ¡Gracias por adelantado!
Puede hacer lo siguiente donde verifica la posición de cada carácter en el prefijo para determinar qué conjunto de datos es el que mejor coincide.
const incoming = { 'number': '123456789' } const data = [{ 'prefix': '1', 'price': 30.5 }, { 'prefix': '123', 'price': 10.5 }, { 'prefix': '12345', 'price': 22.5 } ]; let bestMatch = { matchSuccess: 0, data: data[0] }; for (let i = 0; i < data.length; i++) { let matchSuccess = 0; for (var x = 0; x < data[i].prefix.length; x++) { const c = data[i].prefix.charAt(x); if (data[i].prefix.charAt(x) === incoming.number.charAt(x)) { matchSuccess++; } } if (matchSuccess > bestMatch.matchSuccess) { bestMatch = { matchSuccess, data: data[i] } } } console.log(bestMatch);Del comentario anterior...
"El OP no está buscando ... "la ruta más larga posible desde una matriz de objetos" ... lo que, con suerte, no solo para mí significa un resultado como ...
'data[2].prefix'... para . ..const incoming = { prefix: '123456789' }.El valorincomingproporcionado por el OP incluso no coincidiría con nada debido alnumber: '123456789'par clave-valor (por cierto, elnumberes un tipo de cadena) en lugar delprefix: '123456789'. Recomiendo encarecidamente editar el tema y la descripción del problema".
Pero lo que el OP realmente podría querer es ... filtrar, de una matriz de objetos, el primer objeto donde cualquiera de los valores en cadena de la entrada del objeto coincida con el valor en cadena de la llamada API de la manera más larga posible.
function collectItemOfBestCoveringEntryValue(collector, item) { const { search = '', coverage = 0, result = null } = collector; if (search !== '') { const matchingValues = Object // retrieve all of an item's values. .values(item) // filter any value which matches `search`. .filter(value => { value = String(value); return (( value !== '' ) && ( // it might even goe both ways ... // ... `value` in `search` ... search.includes(value) || // ... or `search` in `value`. value.includes(search) )); }); // retrieve the longest (stringified) value's length. const bestCoverage = String( matchingValues .sort((a, b) => b.length - a.length)[0] ?? '' ).length; if (bestCoverage > coverage) { collector.coverage = bestCoverage; collector.result = item; } } return collector; } const serverSideData = [{ 'prefix': '1', 'price': 30.5, }, { 'prefix': '123', 'price': 10.5, }, { 'prefix': '12345', 'price': 22.5, }]; const apiRequest = { value: '123456789', // or even // value: 123456789, }; const apiResponse = serverSideData .reduce(collectItemOfBestCoveringEntryValue, { search: String(apiRequest.value), result: null, }).result; console.log({ apiResponse }); .as-console-wrapper { min-height: 100%!important; top: 0; }