Tengo dificultades para descubrir cómo acceder a una propiedad de mi objeto javascript.
Tengo una aplicación Node JS que descarga un archivo CSV de la OMS con datos de covid y luego recorro cada una de estas entradas. Así es como recorro cada una de las entradas CSV:
fs.createReadStream("data.csv") .pipe(csv()) .on("data", (data) => { //process data }) .on("end", () => { }); Aquí hay una muestra de la salida cuando ejecuto console.log(data)
{ 'Name': 'Niger', 'WHO Region': 'Africa', 'Cases - cumulative total': '6203', 'Cases - cumulative total per 100000 population': '25.63', 'Cases - newly reported in last 7 days': '64', 'Cases - newly reported in last 7 days per 100000 population': '0.26', 'Cases - newly reported in last 24 hours': '10', 'Deaths - cumulative total': '205', 'Deaths - cumulative total per 100000 population': '0.85', 'Deaths - newly reported in last 7 days': '1', 'Deaths - newly reported in last 7 days per 100000 population': '0', 'Deaths - newly reported in last 24 hours': '0' } Si ejecuto typeof data object .
Me gustaría acceder a algunas propiedades de este objeto. Si envío data["WHO Region"] obtengo "África". Así que esto funciona.
Sin embargo, no puedo acceder al nombre de esos objetos.
console.log(data["Name"]); console.log(data.hasOwnProperty("Name")); Salidas respectivamente undefined y false
Aunque la propiedad de nombre está presente dentro del objeto.
También he intentado listar las claves del objeto con Object.keys(data) y aquí está el resultado:
[ 'Name', 'WHO Region', 'Cases - cumulative total', ... ]Entonces, aparentemente, el nombre de la clave existe, pero no puedo acceder a él por alguna razón. ¿Me estoy perdiendo algo allí?
Tiene un símbolo invisible en la propiedad Name del objeto. Puede verlo si pasa el resultado de console.log en la consola del navegador:
Verifique su archivo CSV original y busque este carácter invisible.
EDITAR: Este símbolo es ZWNBSP (Zero Width No-Break Space) al comienzo del archivo.
El problema se debe a la marca de orden de bytes (BOM) al comienzo del archivo, representada por la secuencia de bytes 0xEF,0xBB,0xBF correspondiente al punto de código UTF-8 U+FEFF .
Una solución fácil para su código sería reemplazar esto así:
const results = []; fs.createReadStream('data.csv') .pipe(csv()) .on('data', (data) => { // Replace BOM in key const key1 = Object.keys(data)[0]; data = { ...data, [key1.replace(/\uFEFF/, '')]: data[key1] }; results.push(data); }) .on('end', () => { results.forEach(result => { console.log(`Name: ${result["Name"]}`); }) });o
Puede abrir el archivo en Nodepad ++ y usar el menú Encoding , cambiarlo de UTF-8-BOM a UTF-8 y guardar.