Ошибка типа: неопределенный не является объектом (оценка ‘arrayofServices.reduce)

#javascript #react-native #object #expo

#javascript #реагировать -родной #объект #выставка

Вопрос:

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

Это запрос firestore для получения сервисов:

 useEffect(() => {
    firebase.firestore().collection("users").doc(uid).collection("my-appointments").get().then((snapshot) => {
        const arrayOfServices = [];
        snapshot.forEach((doc) => {
            arrayOfServices.push(doc.data().serviceType);
    })
    setServices(arrayOfServices);
    })
}, [])
  

Это код массива счетчика (дубликат с другой страницы (настроенный для этой страницы), который работает нормально!):

  const arrayofServices  = services; //services => state the holding the services
    
    const servicesCounter = arrayofServices.reduce((counterObj, service) => {
        if (counterObj.hasOwnProperty(service)) {
          counterObj[service]  = 1;
          return counterObj;
        }
      
        return {
          ...counterObj,
          [service]: 1
        };
      }, {});
      setServicesObj(servicesCounter);
      console.log(servicesCounter);
  

Журнал:

 Object {
  "Learn JavaScript": 2,
  "Learn React": 1,
  "manicure": 3,
}
  

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

1. возможно, массив, который вы уменьшаете, не определен

2. Я добавил журнал этого, очень странно.

3. журнал является объектом, а не массивом, возможно, вам придется сначала преобразовать его в массив, используя логику, которую я дал в одном из предыдущих ответов

4. чтобы выполнить итерацию по объекту, вы могли бы использовать for..in петля

Ответ №1:

Перед вызовом .reduce() добавьте оператор if, чтобы ваше приложение не зависало.

 if(!arrayOfServices) return;
 const servicesCounter = arrayofServices.reduce((counterObj, service) => {
        if (counterObj.hasOwnProperty(service)) {
          counterObj[service]  = 1;
          return counterObj;
        }
      
        return {
          ...counterObj,
          [service]: 1
        };
      }, {});
  

и затем вам нужно выяснить, почему «arrayOfServices» является неопределенным.

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

1. Я не могу понять, почему, проблема в уменьшении, я думаю. один раз он работает, один раз нет

2. Проблема заключается в методе reduce, потому что массив, который вы пытаетесь уменьшить, не определен, поэтому вам нужно проверить arrayOfServices . Например, перед setServices(arrayOfServices) вы должны добавить console.log(arrayOfServices), чтобы увидеть, не определено ли оно.

3. Мне удалось справиться с этим, мой партнер удалил документы из базы данных