Перебор данных JSON для добавления вложенных данных в массив (для добавления в таблицу базы данных MySQL) завершается ошибкой при отсутствующем значении

#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. Нет проблем. Если вы считаете, что ответ был полезным, пожалуйста, отметьте его как допустимый :).