【问题标题】:JavaScript map returning undefined for some elements [duplicate]JavaScript映射为某些元素返回未定义[重复]
【发布时间】:2018-06-10 03:43:20
【问题描述】:

鉴于以下成员数据数组,我将为会员状态不是当前的成员返回一个memberID 的数组。

这是会员数据:

var members = [
  {
    firstName: 'Howard',
    lastName: 'Lee',
    membershipIsCurrent: true,
    MemberID: 235
  },
  {
    firstName: 'James',
    lastName: 'Icharis',
    membershipIsCurrent: false,
    MemberID: 236
  },
  {
    firstName: 'Thomas',
    lastName: 'Cronquist',
    membershipIsCurrent: true,
    MemberID: 237
  },
  {
    firstName: 'Philip',
    lastName: 'Grover',
    membershipIsCurrent: false,
    MemberID: 238
  },
  {
    firstName: 'Eric',
    lastName: 'Broadstone',
    membershipIsCurrent: true,
    MemberID: 239
  },
  {
    firstName: 'Hunter',
    lastName: 'Gonzales',
    membershipIsCurrent: true,
    MemberID: 240
  }];

这是我获取该数据的代码:

function lapsedIDs (array ) {
  return array.map( function ( member ) {
    if ( member.membershipIsCurrent === false ) {
      return member.MemberID;
    }
  });
}

lapsedIDs(members);

这是结果。我不明白为什么它会为每个未失效的会员返回 undefined。有什么指点吗??

[ undefined, 236, undefined, 238, undefined, undefined ]

【问题讨论】:

    标签: javascript object array.prototype.map


    【解决方案1】:

    map() 将为原始数组中的每个现有元素创建一个新元素。

    如果您不 return 在所有条件下使用某些东西,则函数会自动返回 undefined ,这就是您所看到的

    您可以先filter() 删除不需要的项目,然后再map()

     return array.map( function ( member ) {
        return member.membershipIsCurrent
      }).map(function(member){
         return member.MemberID;
      });
    

    【讨论】:

      【解决方案2】:

      为什么会出现这个问题:- 因为 .map 每次都应该在你的情况下返回一个值,如果条件为假,函数返回 undefined 因为你没有提供任何值来返回。 该怎么办 ?先用filter再用ma​​p看看下面的解决办法

      var members = [
        {
          firstName: 'Howard',
          lastName: 'Lee',
          membershipIsCurrent: true,
          MemberID: 235
        },
        {
          firstName: 'James',
          lastName: 'Icharis',
          membershipIsCurrent: false,
          MemberID: 236
        },
        {
          firstName: 'Thomas',
          lastName: 'Cronquist',
          membershipIsCurrent: true,
          MemberID: 237
        },
        {
          firstName: 'Philip',
          lastName: 'Grover',
          membershipIsCurrent: false,
          MemberID: 238
        },
        {
          firstName: 'Eric',
          lastName: 'Broadstone',
          membershipIsCurrent: true,
          MemberID: 239
        },
        {
          firstName: 'Hunter',
          lastName: 'Gonzales',
          membershipIsCurrent: true,
          MemberID: 240
        }];
      function lapsedIDs (array ) {
        return array.filter( function ( member ) {
          return member.membershipIsCurrent === false 
            
        }).map(function(member){
            return member.MemberID;
      });
      }
      
      
      console.log(lapsedIDs(members));

      【讨论】:

        【解决方案3】:

        Array.map() 在源数组中的每个 元素上运行,并将其映射到其他元素。您不会从当前成员返回成员 ID,因此它将它们映射到 undefined。您可能只想修改您的函数,使其以let lapsedMembers = []; 开头,然后使用forEach 而不是map,然后在该循​​环中将ID 推送到lapsedMembers 数组。

        var members = [
          {
            firstName: 'Howard',
            lastName: 'Lee',
            membershipIsCurrent: true,
            MemberID: 235
          },
          {
            firstName: 'James',
            lastName: 'Icharis',
            membershipIsCurrent: false,
            MemberID: 236
          },
          {
            firstName: 'Thomas',
            lastName: 'Cronquist',
            membershipIsCurrent: true,
            MemberID: 237
          },
          {
            firstName: 'Philip',
            lastName: 'Grover',
            membershipIsCurrent: false,
            MemberID: 238
          },
          {
            firstName: 'Eric',
            lastName: 'Broadstone',
            membershipIsCurrent: true,
            MemberID: 239
          },
          {
            firstName: 'Hunter',
            lastName: 'Gonzales',
            membershipIsCurrent: true,
            MemberID: 240
          }];
          
        function lapsedIDs ( array ) {
          let lapsedMembers = [];
          
          array.forEach(function ( member ) {
            if ( member.membershipIsCurrent === false ) {
              lapsedMembers.push(member.MemberID);
            }
          });
          
          return lapsedMembers;
        }
        
        console.log(lapsedIDs(members));

        【讨论】:

          【解决方案4】:

          即使您的membershipIsCurrent 测试失败,map 也希望将 something 放入数组中。所以它会抛出一个undefined

          您可以在地图前filter 以避免这种情况。

          function lapsedIDs(array) {
              return array.filter(member => {
                  return !member.membershipIsCurrent;
              }).map(member => member.MemberID);
          }
          
          lapsedIDs(members);
          

          【讨论】:

            【解决方案5】:

            我试图解决同样的问题,在查看这篇文章后意识到最简单的解决方案是

            function lapsedIDs (array ) {
                return array.map( function ( member ) {
                  if ( member.membershipIsCurrent === false ) {
                    return member.MemberID;
                  }
                }).filter(y => y !== undefined);
            }
            

            在我的情况下,我不知道输入是什么,我不在乎,我只想让地图返回所有定义的值。

            【讨论】:

              猜你喜欢
              • 2021-10-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-04-25
              • 2021-05-24
              • 1970-01-01
              • 2013-06-26
              相关资源
              最近更新 更多