Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase Cloud Firestore doc.data().includes或.IndexOf不';行不通_Javascript_Reactjs_Firebase_Google Cloud Firestore - Fatal编程技术网

Javascript Firebase Cloud Firestore doc.data().includes或.IndexOf不';行不通

Javascript Firebase Cloud Firestore doc.data().includes或.IndexOf不';行不通,javascript,reactjs,firebase,google-cloud-firestore,Javascript,Reactjs,Firebase,Google Cloud Firestore,我正在尝试使用数组,尝试运行doc.data().includes和doc.data().indexOf在我存储在cloud firestore上的数组上,数组是文档中唯一存在的东西 数据是这样排列的 0: example@gmail.com 1: firebase@gmail.com 2: new@gmail.com 为了获取数据,我只需要 firebase.firestore().collection('mails').doc('emails').get().the

我正在尝试使用数组,尝试运行
doc.data().includes
doc.data().indexOf
在我存储在cloud firestore上的数组上,数组是文档中唯一存在的东西

数据是这样排列的

    0: example@gmail.com
    1: firebase@gmail.com
    2: new@gmail.com
为了获取数据,我只需要

firebase.firestore().collection('mails').doc('emails').get().then((doc) => {
            if (doc.exists) {
                console.log(doc.data()); //prints the list of emails in form of array
                doc.data().IndexOf(email); //error IndexOf doesn't exist
                doc.data().includes(email); //error includesOf doesn't exist
            }
            else {
                console.log('data doesn't exist');

            }

        });

要访问
doc.data().IndexOf
doc.data()。包括
或任何其他与数组相关的函数,只需将
doc.data()
转换为如下数组:

var docArray = Object.values(doc.data());
docArray.includes(stringToSearchFor);

Object.values(doc.data())。包括(stringToSearchFor)

这将允许您运行
docArray.includes
docArray.IndexOf
。转换的原因是firebase返回整个文档,它是对象的对象,您可以通过console.log(doc.data())和prototype字段看到这一点。这是因为firestore将数组存储为json对象,这意味着您看到的数组索引号实际上不是索引号,它们只是对象键

意义

0: example@gmail.com
1: firebase@gmail.com
2: new@gmail.com

其中
0,1,2
是索引(或看起来的索引),而
example@gmail.com, firebase@gmail.com, new@gmail.com
是值,但在firestore中,
0,1,2
实际上只是键,它们不是索引。因此,要获取键(数字)或值(电子邮件),我们只需运行
Object.keys(doc.data())//将返回数字
Object.values(doc.data())//将返回电子邮件
,您将获得所需的数组,现在您可以在此数组上运行操作。

访问
doc.data().IndexOf
doc.data()。包括
或任何其他与数组相关的函数,只需将
doc.data()
转换为如下数组:

var docArray = Object.values(doc.data());
docArray.includes(stringToSearchFor);

Object.values(doc.data())。包括(stringToSearchFor)

这将允许您运行
docArray.includes
docArray.IndexOf
。转换的原因是firebase返回整个文档,它是对象的对象,您可以通过console.log(doc.data())和prototype字段看到这一点。这是因为firestore将数组存储为json对象,这意味着您看到的数组索引号实际上不是索引号,它们只是对象键

意义

0: example@gmail.com
1: firebase@gmail.com
2: new@gmail.com

其中
0,1,2
是索引(或看起来的索引),而
example@gmail.com, firebase@gmail.com, new@gmail.com
是值,但在firestore中,
0,1,2
实际上只是键,它们不是索引。因此,要获取键(数字)或值(电子邮件),我们只需运行
Object.keys(doc.data())//将返回数字
Object.values(doc.data())//将返回电子邮件,您将获得所需的阵列,现在您可以在此阵列上运行操作。

我建议您将数据存储在阵列中,而不是Firestore数据库屏幕截图所示的单独字段中

Firestore文档当前包含6个不同的字段,使用
doc.data()
可以将此文档中的所有6个字段作为一个JavaScript对象检索:这就是数组方法无法工作的原因。如果将此数据存储在一个数组中(即,一个数组类型的字段),则可以

您可以尝试以下代码:

  const docRef = firebase.firestore().collection('mails').doc('emails');

  docRef
    .set({
      mails: ['example@gmail.com', 'firebase@gmail.com', 'new@gmail.com'],
    })
    .then(() => {
      return docRef.get();
    })
    .then((doc) => {
      if (doc.exists) {
        const email = 'example@gmail.com';
        console.log(doc.data().mails); 
        console.log(doc.data().mails.indexOf(email)); 
        console.log(doc.data().mails.includes(email)); 
      }
    });

我建议您将数据存储在数组中,而不是像Firestore数据库屏幕截图所示的单独字段中

Firestore文档当前包含6个不同的字段,使用
doc.data()
可以将此文档中的所有6个字段作为一个JavaScript对象检索:这就是数组方法无法工作的原因。如果将此数据存储在一个数组中(即,一个数组类型的字段),则可以

您可以尝试以下代码:

  const docRef = firebase.firestore().collection('mails').doc('emails');

  docRef
    .set({
      mails: ['example@gmail.com', 'firebase@gmail.com', 'new@gmail.com'],
    })
    .then(() => {
      return docRef.get();
    })
    .then((doc) => {
      if (doc.exists) {
        const email = 'example@gmail.com';
        console.log(doc.data().mails); 
        console.log(doc.data().mails.indexOf(email)); 
        console.log(doc.data().mails.includes(email)); 
      }
    });

你能显示数据库的屏幕截图吗(从Firebase控制台)?@RenaudTarnec在那里你能显示数据库的屏幕截图吗(从Firebase控制台)?@RenaudTarnec在那里你得到了一个很好的答案,是的,通常我是这样存储信息的,但后来我像这样存储了这个列表,遇到了对象问题,我找到了一个解决方案,可以轻松地处理您现有的任何数据,我想我应该分享我所做的,只是一点小技巧来克服这个问题,从firebase获取对象并尝试在其上运行数组操作,这是一个很好的答案,是的,通常我会这样存储信息,但后来我像这样存储了这个列表,遇到了对象问题,我找到了一个解决方案,可以轻松处理您现有的任何数据,我想我应该分享我所做的,为了克服这个问题,我们做了一点小改动,从firebase获取对象,然后尝试在其上运行数组操作