循环遍历 JSON 数据以将嵌套数据添加到数组(将添加到 MySQL 数据库 table)因缺少值而失败
Looping through JSON data to add nested data to array (to be added to MySQL database table) fails at missing value
我有这个 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 & Essence",
"productData": []
},
{
"count": 497,
"code": "/beauty/skin-care/moisturiser-and-mist",
"name": "Moisturiser & Mist",
"productData": []
},
{
"count": 354,
"code": "/beauty/skin-care/cleanser-and-exfoliation",
"name": "Cleanser & Exfoliation",
"productData": []
},
{
"count": 345,
"code": "/beauty/skin-care/mask-and-treatment",
"name": "Mask & 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 & 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
我难住了
再见,你的错误可能在这里:
for (let n=0; n<subcat; i++) {...}
尝试将 i
替换为 n
,例如:
for (let n=0; n<subcat; n++) {...}
我有这个 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 & Essence",
"productData": []
},
{
"count": 497,
"code": "/beauty/skin-care/moisturiser-and-mist",
"name": "Moisturiser & Mist",
"productData": []
},
{
"count": 354,
"code": "/beauty/skin-care/cleanser-and-exfoliation",
"name": "Cleanser & Exfoliation",
"productData": []
},
{
"count": 345,
"code": "/beauty/skin-care/mask-and-treatment",
"name": "Mask & 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 & 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
我难住了
再见,你的错误可能在这里:
for (let n=0; n<subcat; i++) {...}
尝试将 i
替换为 n
,例如:
for (let n=0; n<subcat; n++) {...}