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 une is not defined
error.
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 true
cuando 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 -1
si 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