mochaJS: повторение в json - PullRequest
       6

mochaJS: повторение в json

0 голосов
/ 10 сентября 2018

У меня следующая проблема, у меня есть часть json, возвращенная API:

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

и я хочу получить случайный простой идентификатор продукта (простой продукт означает, что внутри него нет поля 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 (assert.notInclude ....)) Uncaught AssertionError: проверяемый объект должен быть массивом, картой, объектом, набором, строкой или слабым набором , но не определено.

Итак, внутри "products" у нас нет массива, потому что там {}, а не []? Есть и другой способ перебора продуктов (их числовые названия меняются каждый день) и сохранение идентификатора в availableProductIdForDelivery

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Итак, внутри "products" у нас нет массива, потому что там {}, а не []?

Правильно. Насколько я могу судить, вы пытаетесь применить утверждение к res.body.menu.categories[i].products[random], но потому что products - это объект (а не список), пытающийся получить индекс (в отличие от одного из ключей, определенных в объекте ) с products[random] возвращает undefined.

Если вы хотите создать список продуктов для оценки их содержания, вы можете использовать Object.values(res.body.menu.categories[i].products)[random]. Насколько мне известно, эта функция является стандартной только в ES2017. Вы также можете применить функцию карты к вашему объекту availableProducts, чтобы получить соответствующие значения для каждого ключа продукта.

0 голосов
/ 11 сентября 2018

Хорошо, спасибо за помощь, теперь она работает так, как я хочу. Ниже моего решения, может быть, это поможет кому-то в будущем:

        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) ;
          }
        }
0 голосов
/ 10 сентября 2018

Ознакомьтесь с документацией: http://www.chaijs.com/api/assert/#method_notinclude

Вы видите, что первым параметром должен быть Array, String или haystack. Давайте посмотрим на сообщение об ошибке, которое вы дали:

Uncaught AssertionError: проверяемый объект должен быть массивом, картой, объект, набор, строка или слабый набор, но неопределенные данные.

Это сообщение об ошибке указывает, что что-то было undefined вместо возможных ожидаемых типов, перечисленных в сообщении. Я думаю, это был первый параметр, но он может быть и третьим, поскольку вы не передали ничего в качестве третьего параметра, поэтому это undefined.

...