我遇到以下问题,我有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
答案 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) ;
}
}