我很难弄清楚如何访问我的 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', ... ]
所以显然键名称确实存在,但由于某种原因我无法访问它。 我是不是错过了什么?
该问题是由文件开头的 字节顺序标记 (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 并保存。
对象的
Name
属性中有不可见的符号。如果您在浏览器控制台中通过了console.log
的结果,您就可以看到它:
检查您的原始 CSV 文件并搜索这个不可见的字符。
编辑: 该符号是文件开头的 ZWNBSP(零宽度无间断空格)。