#javascript #json #object #properties
Вопрос:
Мне трудно понять, как получить доступ к свойству моего объекта javascript.
У меня есть приложение Node JS, которое загружает CSV-файл из ВОЗ с данными covid, а затем я просматриваю каждую из этих записей. Вот как я перебираю каждую из записей 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
Несмотря на то, что свойство name присутствует внутри объекта.
Я также попытался перечислить ключи объекта с помощью Object.keys(data), и вот результат:
[ 'Name', 'WHO Region', 'Cases - cumulative total', ... ]
Итак, очевидно, что имя ключа существует, но я по какой-то причине не могу получить к нему доступ.
Я что-то там упускаю?
Комментарии:
1. У вас есть пример файла CSV? Просто для пояснения.
2. @koloml Это файл CSV с этой страницы covid19.who.int/table Вот ссылка для скачивания: covid19.who.int/WHO-COVID-19-global-table-data.csv
3. Проверьте ответ. Этот файл имеет один символ в начале содержимого.
Ответ №1:
Проблема вызвана меткой порядка байтов (BOM) в начале файла, представленной последовательностью байтов 0xEF,0xBB,0xBF
, соответствующей кодовой точке UTF-8 U FEFF.
Простым обходным путем для вашего кода было бы заменить это следующим образом:
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 (пробел без разрыва нулевой ширины) в начале файла.
Комментарии:
1. Спасибо за вашу помощь! Я не знал об этом символе