首页 > 解决方案 > 如何在不创建重复数组括号的情况下向 JSON 对象添加新数组

问题描述

这些嵌套的 for 循环遍历包含产品类别和子类别的 JSON 对象。它循环通过这些将 URL 参数发送到函数以根据参数抓取网站。我找不到将包含抓取数据的返回数组添加到 JSON 对象(根据其在嵌套循环中的位置)的方法,而不必先创建一个空数组,然后使用 .push 填充它,从而复制数组括号。返回抓取数据的函数已经将数据添加到数组中,所以我不知道该怎么做。

以下循环将正确的数据添加到 JSON 对象,但是数组括号增加了三倍

    for (let i=0; i<obj.length; i++) {
        let subcats = obj[i].subcategories;

        for(let n=0; n<subcats.length; n++) {

            if(!subcats.facetValueData) {
              subcats[n].code.replace(/\s/g, '')
              let productDataSub = []
              subcats[n].productData = productDataSub
              subcats[n].productData.push(await scrapeData(obj[i].subcategories[n].code))

            } else {
              let subcatsFinal = subcats[n].facetValueData

              for(let p=0; p<subcatsFinal.length; p++) {
                subcatsFinal[p].code.replace(/\s/g, '')
                let productData = []
                subcatsFinal[p].productData = productData
                subcatsFinal[p].productData.push(await scrapeData(obj[i].subcategories[n].facetValueData[p].code))
              
              }
            }
        }
    }

以下是循环的 JSON 数据,这productData=[]是 productData 数组应该去哪里的示例,但在循环数据时它存在。这是我想要实现的,但是里面填充了数据。“代码”值是附加到 url 以抓取该页面数据的参数。

 [
    {
        "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": []
                    }
                ]
            }
                    
        ]
    }
]

不确定是否所有必要,但这是抓取页面并返回数组的异步函数:

async function scrapeData(queryParam) {
    let pageCounter = 0;
    var product = []
    var pagination;

      try {
          do {
            var nextPageLink = `currentPage=${pageCounter}&query=::cagCollectionPoint:Departure+from+Singapore:cagCategory:${queryParam}`
            var nextUrl = url.concat(nextPageLink)

            const response = await axios({
                method: "GET",
                url: nextUrl, 
                withCredentials: true,
                headers: headers
            })
            console.log(nextUrl)
            product.push(response.data["products"])
            pagination = response.data["pagination"]["totalPages"]
            pageCounter++;

            // console.log(response.data.currentQuery.query.value)
            
        } while (pageCounter<=0)

        return product;

      } catch (error) {
          console.error(error)
      }
  }

标签: javascriptarraysjsonloops

解决方案


推荐阅读