Проблема здесь, очевидно, в петле. В то время как массив sites
в вашем объекте JSON из файла main.json
содержит только две записи, ваш цикл выполняет четыре итерации. Это означает, что интерпретатор JavaScript (имейте в виду, что он интерпретируется во время выполнения) выдает ошибку в третьем цикле, где он не может найти никакого свойства name
для третьего элемента в массиве sites
, поскольку третьего элемента просто нет ( т.е. объект JSON).
Решение 1:
Вы можете ограничить итерации цикла значением length
массива sites
, изменив условие цикла for
следующим образом:
let main = []
let openJSON = fs.readFileSync('./main.json', 'utf-8');
let parseJSON = JSON.parse(openJSON);
for(let i = 0; i < parseJSON.sites.length; i++){
main.push(parseJSON.sites[i]["name"]);
}
Решение 2:
Если количество итераций должно оставаться на фиксированной длине (например, 4
, как в вашем примере), вы можете отследить ошибку с помощью блока try-catch
. Посмотрите пример ниже.
let main = []
let openJSON = fs.readFileSync('./main.json', 'utf-8');
let parseJSON = JSON.parse(openJSON);
for(let i = 0; i <= 4; i++){
try {
main.push(parseJSON.sites[i]["name"]);
} catch (TypeError) {
// handle TypeError
console.log(`No property 'name' found for entry at index ${i}`)
}
}
Решение 3:
Пока работает решение try-catch
(то есть решение 2), оно может быть слишком большим для данного сценария, как указано в Julian . Поэтому я включил следующее решение, которое проверяет, есть ли в массиве sites
по индексу i
запись или undefined
. Обратите внимание, что я включил две возможности в это решение.
let main = []
let openJSON = fs.readFileSync('./main.json', 'utf-8');
let parseJSON = JSON.parse(openJSON);
for(let i = 0; i <= 4; i++){
// declare current entry (for readability)
const currEntry = parseJSON.sites[i]
// checking if there is an i-th entry in sites
if (currEntry) {
main.push(currEntry["name"]);
}
// same solution, more compact approach
currEntry ? main.push(currEntry["name"]) : null
}