无法从 CSV 文件访问 JavaScript 对象属性

问题描述 投票:0回答:2

我很难弄清楚如何访问我的 javascript 对象的属性。

我有一个 Node JS 应用程序,它从 WHO 下载包含新冠病毒数据的 CSV 文件,然后循环遍历每个条目。以下是我循环遍历每个 CSV 条目的方法:

fs.createReadStream("data.csv")
.pipe(csv())
.on("data", (data) => {
  //process data 
})
.on("end", () => {
});

这是我运行时的输出示例

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'                         
}   

如果我跑步

typeof data
我会得到
object

我想访问这个对象的一些属性。 如果我输出

data["WHO Region"]
我会得到“非洲”。所以这有效。


但是,我无法访问这些对象的名称。

console.log(data["Name"]);
console.log(data.hasOwnProperty("Name"));

分别输出

undefined
false

即使对象中存在名称属性。


我还尝试使用 Object.keys(data) 列出对象的键,结果如下:

 [ 'Name', 'WHO Region', 'Cases - cumulative total', ... ]

所以显然键名称确实存在,但由于某种原因我无法访问它。 我是不是错过了什么?

javascript json object properties
2个回答
3
投票

该问题是由文件开头的 字节顺序标记 (BOM) 引起的,由与 UTF-8 代码点

U+FEFF
对应的字节序列 0xEF,0xBB,0xBF 表示。

代码的一个简单解决方法是像这样替换它:

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"]}`);
    })
});

您可以在 Notepad++ 中打开该文件,然后使用

Encoding
菜单将其从 UTF-8-BOM 更改为 UTF-8 并保存。


2
投票

对象的

Name
属性中有不可见的符号。如果您在浏览器控制台中通过了
console.log
的结果,您就可以看到它:

检查您的原始 CSV 文件并搜索这个不可见的字符。

编辑: 该符号是文件开头的 ZWNBSP(零宽度无间断空格)

© www.soinside.com 2019 - 2024. All rights reserved.