JavaScript中的map函数对于某些元素返回undefined

4

给定以下成员数据数组,我需要返回一个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 ]

5个回答

9
map() 会为原始数组中的每个现有元素创建一个新元素。
如果您没有为所有条件 return 某些内容,函数会自动返回 undefined,这就是您所看到的内容。
您可以先使用 filter() 删除不需要的项目,然后再使用 map()
 return array.map( function ( member ) {
    return member.membershipIsCurrent
  }).map(function(member){
     return member.MemberID;
  });

3

为什么会出现这个问题:因为.map每次都应该返回一个值,如果条件为false,则函数返回undefined,因为您没有提供要返回的任何值。

该怎么办?首先使用filter,然后再使用map,请参考下面的解决方案:

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));


0

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));


0
那个 map 想要将一些东西放入数组中,即使您的 membershipIsCurrent测试失败。 所以它会抛出undefined
在进行映射之前,您可能需要使用 filter来避免这种情况发生。
function lapsedIDs(array) {
    return array.filter(member => {
        return !member.membershipIsCurrent;
    }).map(member => member.MemberID);
}

lapsedIDs(members);

0
我试图解决同样的问题,并在查看此帖子后意识到最简单的解决方案是:
function lapsedIDs (array ) {
    return array.map( function ( member ) {
      if ( member.membershipIsCurrent === false ) {
        return member.MemberID;
      }
    }).filter(y => y !== undefined);
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接