为什么地图返回 [undefined]?我该如何解决?

Why map is returning [undefined]? and how can i solve that?

我想过滤我的快照,但有时我会收到 [undefined],我不想 return undefined inside,这是什么问题?

return snapshot.docs.map((doc) => {
  const jn = JSON.parse(doc.data().jsonData)
  const res=  jn.attributes.find(t => t.typet === tokenAttrs[0].name);
  if(res){
    return doc.data()
  }
}) 

可能找不到符合条件的属性,导致res未定义。你应该去看看。

多种解决方法。一种是使用 foreach 并将新值推送到新数组。或者在将结果发回之前过滤掉结果中的空值。像那样:

const r = snapshot.docs.map((doc) => {
      const jn = JSON.parse(doc.data().jsonData)
      const res=  jn.attributes.find(t => t.typet === tokenAttrs[0].name);
      if(res){
        return doc.data()
      } else {
        return null;
      }
    }) 
    
// then remove all empty values
return r.filter(n => n)

使用 forEach()

const res = []; 
snapshot.docs.forEach((doc) => {
  const jn = JSON.parse(doc.data().jsonData)
  const res=  jn.attributes.find(t => t.typet === tokenAttrs[0].name);
  if (res){
    res.push(doc.data());
  }
}) 

return res;

您可以这样使用 filter 函数:

return snapshot.docs.map(doc => {
    const jn = JSON.parse(doc.data().jsonData);
    const res = jn.attributes.find(t => t.typet === tokenAttrs[0].name);

    if (res) return doc.data();
}).filter(_ => _ !== undefined);

这将从数组中删除 undefined 个值。

Array.prototype.find 将搜索数组并获取所有匹配数据。如果没有找到,则 returns undefined。您只需要创建一个逻辑 OR 表达式。请参阅下面的代码:

return snapshot.docs.map((doc) => {
      const jn = JSON.parse(doc.data().jsonData)
      // will now return null if there's no matched data.
      const res =  jn.attributes.find(t => t.typet === tokenAttrs[0].name) || null;
      if(res){
        // this will not return if `res` is null
        return doc.data()
      } else {
        // you could do `else` here if you want to do something if there's no matched data.
        // Do something
      }
    })