代码之家  ›  专栏  ›  技术社区  ›  Gusta

为什么是我的物品。values()当我的对象数组有匹配的值时返回false?

  •  0
  • Gusta  · 技术社区  · 3 年前

    我有一个变量, memberId 它有独特的价值。我想用 Object.values() 在我的firebase对象数组中,为数组中唯一的firebase ID返回true。这是一个控制台。我的日志 memberArr 这是之前定义的 onValue 称为 let memberArr= [];

    [
      {
        "-N0IZXQkPiHD9yfwi-M1": {
          "member_id": "7cCfvX0eAlPGmamCTahFSu4p2xl1"
        }
      },
      {
        "-N0KSFc1rg91sufbUftO": {
          "member_id": "7cCfvX0eAlPGmamCTahFSu4p2xl1"
        },
        "-N0KSRwxNp34-JhkLWDE": {
          "member_id": "ssKze4rM5ucJWY9oBaJAMY7zUG03"
        }
      },
      {
        "-N0bdv6XGGfW-HDA2heI": {
          "member_id": "Lu7cfs7stqhgXXzAUp9iA7OxYaH2"
        }
      },
      {
        "-N0bnRZKUDBULaCECPfq": {
          "member_id": "Lu7cfs7stqhgXXzAUp9iA7OxYaH2"
        }
      }
    ]
    

    我的 memberId 与的最后两个值相同 2 3 在哪里 member_id: 'Lu7cfs.. 在这段代码之后:

    onValue(dbRef, (snapshot) => {
      const data = snapshot.val();
      for (var key in data) {
        if (data.hasOwnProperty(key)) {
          groupArr = data[key];
        }
      }
      snapshot.forEach((groupSnapshot) => {
        memberArr.push(groupSnapshot.child("members").val());
        let memberExists = Object.values(memberArr).includes(memberId);
        console.log(memberArr);
      });
    });
    

    memberExists 应该为最后两个返回true,但对所有这些返回false。

    这是控制台的图片。阵列的日志:

    enter image description here

    0 回复  |  直到 3 年前
        1
  •  0
  •   Yuriy Yakym    3 年前

    您需要将数组映射到成员ID的数组中,然后对它们进行计数,并过滤掉出现次数超过1次的成员ID。

    要获取所有ID的数组,请执行以下操作:

    const ids = memberArr
      .map(entry => Object.values(entry))
      .map(({ member_id }) => member_id);
    // ids = ['7cCfvX0eAlPGmamCTahFSu4p2xl1', '7cCfvX0eAlPGmamCTahFSu4p2xl1', 'ssKze4rM5ucJWY9oBaJAMY7zUG03', 'Lu7cfs7stqhgXXzAUp9iA7OxYaH2', 'Lu7cfs7stqhgXXzAUp9iA7OxYaH2']
    

    以下是获取唯一ID的完整代码:

    const countMap = memberArr
      .map(entry => Object.values(entry))
      .map(({ member_id }) => member_id)
      .reduce((idsCountMap, id) => {
        idsCountMap[id] = idsCountMap[id] || 0;
        idsCountMap[id]++;
        return idsCountMap;
      }, {});
    
    const uniqueIds = Object.entries(countMap)
      .filter(([, count]) => count === 1)
      .map(([id]) => id);
    
        2
  •  0
  •   Gusta    3 年前

    成功了!基本上需要创建一个对象数组。值()并执行 forEach 在每一个物体上,然后做一个 if statement 比较 obj.member_id 用我的 memberId

    snapshot.forEach((groupSnapshot) => {
      var memberValue = (groupSnapshot.child('members').val())
      var uniqueMemberArr = (Object.values(memberValue))
          uniqueMemberArr.forEach((memberObj) => {
          if(memberObj.member_id == memberId) {
          ....
    
    
        3
  •  0
  •   Yosvel Quintero    3 年前

    你可以做:

    const data = [{'-N0IZXQkPiHD9yfwi-M1': { member_id: '7cCfvX0eAlPGmamCTahFSu4p2xl1'}},{'-N0KSFc1rg91sufbUftO': {member_id: '7cCfvX0eAlPGmamCTahFSu4p2xl1'},'-N0KSRwxNp34-JhkLWDE': {member_id: 'ssKze4rM5ucJWY9oBaJAMY7zUG03'}},{'-N0bdv6XGGfW-HDA2heI': {member_id: 'Lu7cfs7stqhgXXzAUp9iA7OxYaH2'}},{'-N0bnRZKUDBULaCECPfq': {member_id: 'Lu7cfs7stqhgXXzAUp9iA7OxYaH2'}}]
    
    const ids = data
      .map(
        o => Object
          .values(o)
          .map(o => o.member_id)
      )
      .flat()
    
    const hasDuplicatedIds = (new Set(ids)).size !== ids.length
    
    console.log(hasDuplicatedIds)