Как я могу получить карту из Firestore и перебрать ее?

participantUIDs — это карта в документе Firestore:

Я получаю этот документ из Firestore (эта часть выполнена успешно) и пытаюсь перебрать карту, чтобы поместить ее ключи в виде строк в массив. К сожалению, это не работает. Консоль говорит, что я не могу использовать forEach (и обычный цикл for) в participantUIDsMap. Что не так с моей картой?

const chatDoc = await admin.firestore().doc(`group_chats/${context.params.chatId}`).get()
// the document is retrieved successfully, I checked it with another field.
const participantUIDsMap: Map<string, boolean> = chatDoc.get('participantUIDs')
const participantUIDsArray: string[] = []
participantUIDsMap.forEach((value, key) => {
  if (value === true && key != senderUid) {
    participantUIDsArray.push(key)
  }
})
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
1 310
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

chatDoc.get('participantUIDs') не будет возвращать объект карты ES6. Если именованное поле представляет собой поле типа карты, оно возвращает простой объект JavaScript, имена свойств которого совпадают с именами полей в поле карты Firestore. Поэтому forEach не сработает — на этом объекте такого метода просто нет. Итак, если вы хотите сделать предположение, что memberUID — это поле карты Firebase, ваше задание должно выглядеть примерно так:

const participantUIDs: any = chatDoc.get('participantUIDs')

Если вы хотите повторить свойства этого объекта, вы можете использовать один из многих вариантов, предоставляемых JavaScript. См.: Перебор свойств объекта

Да, здесь вы «теряете» информацию о типе, и да, вам, вероятно, следует проводить больше ручной проверки типов для всего, если вы не можете безопасно делать предположения о типах. Firestore SDK просто не предоставляет этого для вас, поскольку к документам не применяется схема.

Спасибо за пояснение!

Florian Walther 21.12.2020 22:06

Я знаю, что это старо, но я столкнулся с той же проблемой и смог решить ее следующим образом:

const docRef = doc(db, "collection", "id");
const docSnap = await getDoc(docRef);
if (docSnap.exists()) {
    console.info("Document data:", docSnap.data());
    console.info("Map field:", docSnap.data().mapField)
    docSnap.data().mapField.forEach((value, key) => {
        console.info('Value', value, 'key', key)
    })
} else {
    // doc.data() will be undefined in this case
    console.info("No such document!");
}    

Другие вопросы по теме