JavaScript映射为某些元素返回未定义[重复]

Posted

技术标签:

【中文标题】JavaScript映射为某些元素返回未定义[重复]【英文标题】:JavaScript map returning undefined for some elements [duplicate] 【发布时间】: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 ]

【问题讨论】:

【参考方案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);

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

【讨论】:

以上是关于JavaScript映射为某些元素返回未定义[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Javascript函数返回未定义,预期整数值[重复]

Javascript元素数组innerHTML返回未定义

由于某些 javascript 提升,变量显示为未定义

JavaScript slice / substring仅在替换HTML innerText时返回未定义

javascript中未定义的Object.length [重复]

Java Map用法