Значение проверки вложенного массива Javascript существует или нет

#javascript #arrays #function

Вопрос:

Я использую React для своего приложения. Я пытаюсь сделать одно приложение для доставки еды. В моем приложении есть несколько ресторанов. В некоторых ресторанах есть время доставки, а в некоторых его нет. У всех ресторанов есть дата на ближайшие 7 дней.

У некоторых ресторанов нет времени доставки в течение первых двух дней, но после этого у ресторана есть время доставки в течение остальной части недели. У некоторых ресторанов вообще нет времени доставки в течение следующих семи дней.

Я хочу создать вспомогательную функцию, которая проверит, есть ли в данных ресторана время доставки или нет.

PS: Я пытаюсь научиться МОДУЛЬНОМУ тестированию. Было бы здорово, если бы вы показали мне, как выполнить модульное тестирование моей вспомогательной функции.

Это мои примерные данные, в которых указаны даты и время доставки:

  {
  deliveryMethod: "PICKUP",
  deliverySlots: [
    {
      date: "2021-08-04",
      deliveryTimes: [],
    },
    {
      date: "2021-08-05",
      deliveryTimes: [],
    },
    {
      date: "2021-08-06",
      deliveryTimes: [],
    },
    {
      date: "2021-08-07",
      deliveryTimes: [
        {
          time: "16:30-17:00",
          validFrom: "2020-08-07",
          validUntil: "2023-08-07",
        },
        { 
          time: "18:00-19:00",
          validFrom: "2020-08-07",
          validUntil: "2023-08-07",
        },
      ],
    },
  ],
}
 

Это мои примерные данные, в которых есть даты и нет времени доставки:

  {
  deliveryMethod: "PICKUP",
  deliverySlots: [
    {
      date: "2021-08-04",
      deliveryTimes: [],
    },
    {
      date: "2021-08-05",
      deliveryTimes: [],
    },
    {
      date: "2021-08-06",
      deliveryTimes: [],
    },
    {
      date: "2021-08-07",
      deliveryTimes: [],
    },
  ],
}
 

После передачи значения в функцию я застрял, как проверить, существуют ли какие-либо сроки доставки или нет.

 const deliveryArea = {
  deliveryMethod: "PICKUP",
  deliverySlots: [
    {
      date: "2021-08-04",
      deliveryTimes: [],
    },
    {
      date: "2021-08-05",
      deliveryTimes: [],
    },
    {
      date: "2021-08-06",
      deliveryTimes: [],
    },
    {
      date: "2021-08-07",
      deliveryTimes: [
        {
         
          time: "16:30-17:00",
          validFrom: "2020-08-07",
          validUntil: "2023-08-07",
        },
        {
         
          time: "18:00-19:00",
          validFrom: "2020-08-07",
          validUntil: "2023-08-07",
        },
      ],
    },
    {
      date: "2021-08-08",
      deliveryTimes: [
        {
         
          time: "16:30-17:00",
          validFrom: "2020-08-08",
          validUntil: "2023-08-08",
        },
        {
        
          time: "18:00-19:00",
          validFrom: "2020-08-07",
          validUntil: "2023-08-07",
        },
      ],
    },
    {
      date: "2021-08-09",
      deliveryTimes: [],
    },
    {
      date: "2021-08-10",
      deliveryTimes: [
        {
         
          time: "16:30-17:00",
          validFrom: "2020-08-10",
          validUntil: "2023-08-10",
        },
        {
         
          time: "18:00-19:00",
          validFrom: "2020-08-10",
          validUntil: "2023-08-10",
        },
      ],
    },
  ],
};

const helperFunction = (deliveryArea) => {
  console.log(deliveryArea); // in here i stuck
};

helperFunction(deliveryArea); 

Комментарии:

1. Что касается вашего «PS»: Это немного больше, чем просьба. Переполнение стека здесь, чтобы помочь с конкретными проблемами, с которыми вы можете столкнуться, но я не думаю, что кто-то захочет предоставить здесь полный учебник. (Кроме того, запрос должен охватывать только одну конкретную проблему) Выберите структуру модульного тестирования, и должна быть документация и дополнительные онлайн-материалы о том, как с ней работать. Затем, чтобы проверить эту конкретную функцию, просто приведите два примера объектов, как в этом вопросе, и убедитесь, что функция возвращает true или false, как и ожидалось.

Ответ №1:

Вы можете использовать Array.prototype.some() для того, чтобы проверить, существует ли по крайней мере один слот, где deliverytimes не пусто:

 const deliveryArea = { deliveryMethod: "PICKUP", deliverySlots: [{date: "2021-08-04", deliveryTimes: [],},{date: "2021-08-05", deliveryTimes: [],},{date: "2021-08-06", deliveryTimes: [],},{date: "2021-08-07", deliveryTimes: [{startTime: 600,time: "16:30-17:00", validFrom: "2020-08-07", validUntil: "2023-08-07", },{startTime: 660,time: "18:00-19:00", validFrom: "2020-08-07", validUntil: "2023-08-07", },],},{date: "2021-08-08", deliveryTimes: [],},{date: "2021-08-09", deliveryTimes: [],},{date: "2021-08-10", deliveryTimes: [{startTime: 600,time: "16:30-17:00", validFrom: "2020-08-10", validUntil: "2023-08-10", },{startTime: 660,time: "18:00-19:00", validFrom: "2020-08-10", validUntil: "2023-08-10", },],},],};
const deliveryAreaWithNoDeliveryTimes = { deliveryMethod: "PICKUP", deliverySlots: [{date: "2021-08-04", deliveryTimes: [],},{date: "2021-08-05", deliveryTimes: [],},{date: "2021-08-06", deliveryTimes: [],},{date: "2021-08-07", deliveryTimes: [],},],};

// will return true if there are any delivery times defined, false otherwise
const hasDeliveryTimes = (deliveryArea) => {
  return deliveryArea.deliverySlots.some((slot) => {
    return slot.deliveryTimes.length;
  });
};

console.log(hasDeliveryTimes(deliveryArea));
console.log(hasDeliveryTimes(deliveryAreaWithNoDeliveryTimes)); 

Комментарии:

1. Я думаю, что не понимаю, в чем проблема… Возвращаемое значение соответствует имени функции. Использование ! для отрицания абсолютно нормально… Или просто переключите свои выписки о возврате.

2. Я все еще не понимаю, извини! Если он уже построен, как вы вообще собираетесь вставить свою вспомогательную функцию?

3. Я не понимаю, в чем проблема ! … Вы могли бы поместить его перед возвращаемым значением внутри функции: return slot.deliveryTimes.length; но тогда скорее должно быть имя функции doesNotHaveDeliveryTimes