#javascript #mysql #json #object #nested-loops
#javascript #mysql #json #объект #вложенные циклы
Вопрос:
У меня есть этот 4-уровневый цикл if, который перебирает объект JSON из файла. Целью здесь является создание массива, который будет добавлен в строку базы данных MySQL.
Цикл должен фильтровать json, а затем добавлять определенные значения в массив:
var content = fs.readFileSync("dataSubcats.json");
var jsonContent = JSON.parse(content);
var values = [];
for(let i=0; i<jsonContent.length; i ) {
if (jsonContent[i].subcategories) {
let subcat = jsonContent[i].subcategories.length;
for (let n=0; n<subcat; n ) {
if(jsonContent[i].subcategories[n]) {
let subsubcat = jsonContent[i].subcategories[n].facetValueData.length
for (let p=0; p<subsubcat; p ) {
if(jsonContent[i].subcategories[n].facetValueData) {
let products = jsonContent[i].subcategories[n].facetValueData[p].productData.length
for (let f=0; f<products; f ) {
var productDataFinal = jsonContent[i].subcategories[n].facetValueData[p].productData[f]
values.push([
jsonContent[i].id, jsonContent[i].categoryName,
jsonContent[i].subcategories[n].name, jsonContent[i].subcategories[n].code,
jsonContent[i].subcategories[n].facetValueData[p].name, jsonContent[i].subcategories[n].facetValueData[p].code,
productDataFinal.productDisplayName, productDataFinal.code,
productDataFinal.url, productDataFinal.imageUrl,
productDataFinal.price.value, productDataFinal.originPrice.value,
productDataFinal.price.currencyIso, productDataFinal.inStock,
productDataFinal.newProduct
])
}
}
}
} else {
console.log(`No facetvalue data found at ${jsonContent[i]}`)
}
}
} else {
console.log(`No subcats found at ${jsonContent[i]}`)
}
}
Структура JSON выглядит следующим образом:
[
{
"id": 0,
"categoryName": "Beauty",
"subcategories": [
{
"count": 2688,
"code": "/beauty/skin-care",
"name": "Skincare",
"facetValueData": [
{
"count": 682,
"code": "/beauty/skin-care/lotion-serum-and-essence",
"name": "Lotion Serum amp; Essence",
"productData": []
},
{
"count": 497,
"code": "/beauty/skin-care/moisturiser-and-mist",
"name": "Moisturiser amp; Mist",
"productData": []
},
{
"count": 354,
"code": "/beauty/skin-care/cleanser-and-exfoliation",
"name": "Cleanser amp; Exfoliation",
"productData": []
},
{
"count": 345,
"code": "/beauty/skin-care/mask-and-treatment",
"name": "Mask amp; Treatment",
"productData": []
}
]
},
{
"count": 1549,
"code": "/beauty/makeup",
"name": "Makeup",
"facetValueData": [
{
"count": 653,
"code": "/beauty/makeup/face",
"name": "Face",
"productData": []
},
{
"count": 460,
"code": "/beauty/makeup/makeup-lips",
"name": "Lips",
"productData": []
},
{
"count": 337,
"code": "/beauty/makeup/eyes",
"name": "Eyes",
"productData": []
},
{
"count": 124,
"code": "/beauty/makeup/makeup-cheeks",
"name": "Cheeks",
"productData": []
}
]
}
]
},
{
"id": 1,
"categoryName": "Electronics",
"subcategories": [
{
"count": 526,
"code": "/electronics/audio-devices",
"name": "Audio",
"facetValueData": [
{
"count": 153,
"code": "/electronics/audio-devices/speakers",
"name": "Speakers",
"productData": []
},
{
"count": 145,
"code": "/electronics/audio-devices/earphones",
"name": "Earphones",
"productData": []
},
{
"count": 142,
"code": "/electronics/audio-devices/headphones",
"name": "Headphones",
"productData": []
},
{
"count": 51,
"code": "/electronics/audio-devices/true-wireless-and-airpods",
"name": "True Wireless amp; Airpods",
"productData": []
}
]
}
]
}
]
так продолжается в общей сложности для 10 объектов CategoryName (возможно, я неправильно заключил некоторые скобки, но в моем скрипте это правильно).
Цикл всегда прерывается со следующей ошибкой:
let subsubcat = jsonContent[i].subcategories[n].facetValueData.length
^
TypeError: Cannot read property 'length' of undefined
at Object.<anonymous> (/Users/Desktop/NodeScraper/db.js:18:80)
at Module._compile (internal/modules/cjs/loader.js:1137:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
at Module.load (internal/modules/cjs/loader.js:985:32)
at Function.Module._load (internal/modules/cjs/loader.js:878:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
at internal/main/run_main_module.js:17:47
Я в тупике
Комментарии:
1. Не могли бы вы поделиться кодом, который пытается получить содержимое из файла?
2. Странная структура JSON. Если я напечатаю это, я получу сообщение об ошибке…
3. Когда я проверяю JSON,
subcategories
массив не закрыт. То же самое касаетсяfacetValueData
. Может ли это быть проблемой? Или это просто ошибка копирования-вставки?4. JSON на самом деле намного длиннее этого, это только для примера
5. Да, мои извинения, это просто ошибка копирования и вставки, которую я исправлю
Ответ №1:
Чао, ваша ошибка может быть здесь:
for (let n=0; n<subcat; i ) {...}
попробуйте заменить i
на n
like:
for (let n=0; n<subcat; n ) {...}
Комментарии:
1. Спасибо, я изменил свой код в соответствии с вашим предложением, к сожалению, ошибка все еще сохраняется
2. Теперь ошибка гласит
let subsubcat = jsonContent[i].subcategories[n].facetValueData.length ^ TypeError: Cannot read property 'length' of undefined
3. Я понял это, оператор if «if(jsonContent[i].subcategases[n].facetValueData)» должен был находиться над циклом for непосредственно перед ним, а не ниже. Спасибо за помощь
4. Нет проблем. Если вы считаете, что ответ был полезным, пожалуйста, отметьте его как допустимый :).