【问题标题】:Unable to access JavaScript Object property from CSV file无法从 CSV 文件访问 JavaScript 对象属性
【发布时间】:2021-12-08 22:08:13
【问题描述】:

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

我有一个 Node JS 应用程序,它从 WHO 下载带有 covid 数据的 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"));

分别输出undefinedfalse

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


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

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

显然,密钥名称确实存在,但由于某种原因我无法访问它。 我错过了什么吗?

【问题讨论】:

标签: javascript json object properties


【解决方案1】:

该问题是由文件开头的Byte Order Mark (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"]}`);
    })
});

您可以在 Nodepad++ 中打开文件并使用 Encoding 菜单将其从 UTF-8-BOM 更改为 UTF-8 并保存。

【讨论】:

    【解决方案2】:

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

    检查您的原始 CSV 文件并搜索此隐形字符。

    编辑:这个符号是文件开头的ZWNBSP (Zero Width No-Break Space)

    【讨论】:

    • 感谢您的帮助!我不知道那个符号
    猜你喜欢
    • 2021-11-06
    • 2018-09-13
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 2014-03-10
    • 2011-07-05
    相关资源
    最近更新 更多