GOOGLE ADS

martes, 19 de abril de 2022

array.find(name) devuelve TypeError name no es una función - Javascript

Busqué preguntas similares en línea, pero no pude encontrar una solución que funcionara para mí.


  • Pregunta similar pero con jquery

  • Pregunta similar pero con MongoDb

  • Error similar pero no funciona

  • Pregunta similar pero no funciona


Problema

Tengo las siguientes 2 constantes:

const short_names = { aa: 'AppleAid', bb: 'BananaBoat', cc: 'CloudCut'};
const long_names = ['AppleAid', 'BananaBoat', 'CloudCut'];

Y la siguiente función personalizadafind_name(name)

function find_name(name) {
if (name.length === 2) return (short_names[name] || 'na');
else return (long_names.find(name) || 'na');
}

al correr

console.log(find_name('BananaBoat'))

Localmente y en un compilador en línea, encuentro lo mismo TypeError:

node /tmp/o2G8YS3Ds1.js
/tmp/o2G8YS3Ds1.js:6
else return (long_names.find(name) || 'na');
^
TypeError: BananaBoat is not a function
at Array.find (<anonymous>)
at find_name (/tmp/o2G8YS3Ds1.js:6:29)
at Object.<anonymous> (/tmp/o2G8YS3Ds1.js:9:13)
at Module._compile (internal/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
at startup (internal/bootstrap/node.js:283:19)

Intentos fallidos


  • Intenté cambiar mi declaración de impresión a esto:
    console.log(find_name('BananaBoat')[0])


  • También intenté cambiar mi función para usar la notación ternaria:
    function find_name(name) {
    return (name.length === 2)? (short_names[name] || 'na'): (long_names.find(name) || 'na');
    }


  • He intentado implementar esta respuesta con el uso de filter:
    function find_name(name) {
    if (name.length === 2) return (short_names[name] || 'na');
    else return (long_names.filter(function (x) {
    return x === e
    })[0]|| 'na');
    }

    Pero luego me sale un e is not definederror.


Editar

El objetivo es hacer que la función devuelva el nombre del elemento coincidente si hay uno y, si no, solo na.

Estoy seguro de que esta es una solución sencilla para un simple error que cometí, pero como no soy un experto en Javascript, no puedo encontrar la solución.


Solución del problema

Esto se debe a que find toma una función como argumento, no una cadena. Si quisiera usarlo aquí, necesitaría proporcionar una función, como (s) => s === 'BananaBoat', como argumento. La función que proporcione debería regresar truecuando encuentre el elemento que está buscando:

function find_name(name) {
if (name.length === 2) return (short_names[name] || 'na');
else return (long_names.find((s) => s === 'BananaBoat')!== -1 || 'na');
}

En su lugar, sugeriría usar indexOf. Devuelve el primer índice de la cadena que pasa, o -1si no se encuentra el elemento:

function find_name(name) {
if (name.length === 2) return (short_names[name] || 'na');
else return (long_names.indexOf(name)!== -1 && name || 'na');
}

También podría considerar esto, que podría ser un poco más claro:

function find_name(name) {
if (name.length === 2) return (short_names[name] || 'na');
if (long_names.indexOf(name)!== -1) return name;
return 'na';
}

No hay comentarios.:

Publicar un comentario

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...