mochaJS:在json中迭代

时间:2018-09-10 14:15:27

标签: javascript json api mocha chai

我遇到以下问题,我有api返回的json部分:

...
"name": "NEWS",
"products": {
  "10432471": {
     "id": 10432471,
     "productConfig": [
      ...
     ]
  },
  "10432481": {
     "id": 10432481
  },
  "17300241": {
     "id": 17300241
  },
  "17300251": {
     "id": 17300251,
     "productConfig": [
      ...
     ]
  },
  "18420501": {
     "id": 18420501
  }
}
...

我想获取随机的简单产品ID(简单产品意味着它内部没有productConfig字段)

        for (i=0;i<res.body.menu.categories.length;i++){
          if(res.body.menu.categories[i].name=='NEWS'){ 
              availableProducts = Object.keys(res.body.menu.categories[i].products);
              console.log ('avbl prods from news category: ',availableProducts);
              for (j=0;;j++){      
                random=Math.floor(Math.random()*Object.keys(res.body.menu.categories[i].products).length);       
                if(assert.notInclude(res.body.menu.categories[i].products[random],'productConfig')){
                  availableProductIdForDelivery = res.body.menu.categories[i].products[random].id;
                  break;
                }
              }
          }
        }

这段代码给我第二个if(if(if(assert.notInclude ....))Uncaught AssertionError错误:测试的对象必须是数组,映射,对象,集合,字符串或弱集,但未定义。

因此,在“产品”内部我们没有数组,因为这里有{},而不是[]? 还有其他方法可以迭代产品之间的甜菜(它们的数字名称每天都会更改)并将ID保存到availableProductIdForDelivery

3 个答案:

答案 0 :(得分:0)

看看文档:{​​{3}}

您看到第一个参数必须是Array,String或haystack。让我们看看您给出的错误消息:

  

未捕获的AssertionError:测试的对象必须是数组,映射,   对象,集合,字符串或弱集,但未定义。

此错误消息表示某些内容为undefined,而不是消息中列出的可能的预期类型。我猜它是第一个参数,但也可能是第三个参数,因为您没有传递任何东西作为第三个参数,所以它是undefined

答案 1 :(得分:0)

  

因此,在“产品”内部我们没有数组,因为这里有{},而不是[]?

正确。据我所知,您正在尝试将断言应用于res.body.menu.categories[i].products[random],但是由于products是试图检索索引(与键之一相反)的对象(而不是列表) products[random]中的对象定义)返回undefined

如果要创建产品列表以评估其内容,则可以使用Object.values(res.body.menu.categories[i].products)[random]。据我所知,此功能仅是ES2017的标准功能。您也许还可以将映射函数应用于availableProducts对象,以检索每个产品密钥的对应值。

答案 2 :(得分:0)

好,谢谢您的帮助,现在它可以按我的要求工作了。在我的解决方案之下,也许它对将来的某个人有帮助:

        for (i=0;i<res.body.menu.categories.length;i++){
          if(res.body.menu.categories[i].name=='NEWS'){  //random simple product from 'news' category
              availableProducts = Object.keys(res.body.menu.categories[i].products);
              console.log ('avbl prods from news category: ',availableProducts);
              while(availableProductIdForDelivery==''){      
                random=Math.floor(Math.random()*Object.keys(res.body.menu.categories[i].products).length);       
                  if((Object.values(res.body.menu.categories[i].products)[random].productConfig).length==0)
                    availableProductIdForDelivery = Object.values(res.body.menu.categories[i].products)[random].id;                
              }
              console.log('random simple product: '+availableProductIdForDelivery) ;
          }
        }