如何跳过数组.map的元素?

18
var userids = userbody.contacts.map(function(obj){

  if((obj.iAccepted=='true')&&(obj.contactAccepted=='true')) {
    console.log(true);
    return obj.userID //return obj.userID
  } 

});

这将会得到如下结果:

[ '0', '35', '37', '30', '34', '36', '33', '32', undefined, '332', '328', '337', '333', undefined ]

我希望跳过数组中的undefined元素。


它返回了一个false元素,但我想跳过它,我需要的结果是[ '0', '35', '37', '30', '34', '36', '33', '32', '332', '328', '337', '333'],而不是[ '0', '35', '37', '30', '34', '36', '33', '32', false, '332', '328', '337', '333', false ]。 - Sumit Aggarwal
3
可能是 javascript skip element on .map() 的重复问题。 - Frazer Kirkman
这个问题有更完整、更高效的答案,请参考以下链接: https://dev59.com/RWAf5IYBdhLWcg3wSRLi - Frazer Kirkman
5个回答

49

这就是Array.prototype.filter()的用途。你需要分两步完成。

var userids = userbody.contacts
    .filter(contact => contact.iAccepted == 'true' && contact.contactAccepted == 'true')
    .map(contact => contact.userId);

筛选部分将所有不必要的元素去除,然后映射就将剩下的转换成您想要的方式。


你是否正在使用已弃用的node.js?即使在node.js LTS v4.2.4中,它对我来说也运行良好,在jsbin上也是如此。 - Z4-
1
不是吧?很明显你正在使用过时的node.js,你可以通过使用node --version来检查,我建议至少使用v4.x。如果不可能,你就不能使用箭头函数,使用ES5语法,babel可以帮助你如果你有困难的话。 - Z4-
是的,那个已经过时了,请按照我之前发布的 Babel 链接,并在右侧窗格中使用 ES5 样式代码。 - Z4-
变量userids是通过筛选userbody.contacts中符合条件的联系人,再将其userId提取出来得到的。其中符合条件的联系人需要满足iAccepted和contactAccepted均为'true'。 - Sumit Aggarwal
那么你的输入数据肯定有问题,检查一下这个bin,它在浏览器和node.js中都能返回预期的输出... - Z4-
显示剩余3条评论

1

你可以使用flatMap

flatMap() 方法通过对数组的每个元素应用给定的回调函数,然后将结果扁平化一级来返回一个新数组。它等同于 map() 后跟深度为 1 的 flat(),但比单独调用这两种方法略微更有效率。

var userids = userbody.contacts.flatMap((obj)=>{
  if((obj.iAccepted=='true')&&(obj.contactAccepted=='true')) {
    return obj.userID 
  } 
  else{
    return[];
  }

});

1

您可以使用 Array.reduce 函数来实现 Array.mapArray.filter 过程在一个函数中,如下所示。

const userIds = userbody.contacts.filter((acc, cur) => {
  if((obj.iAccepted == 'true') && (obj.contactAccepted == 'true')) {
    acc.push(obj.userID);
  }
  return acc;
}, []);
console.log(userIds);

0

您可以过滤掉错误的值:

userids = userids.filter((i) => i);

或者,如果您无法使用箭头函数:

userids = userids.filter(function(i) { return i; });

我的值不是像true或false那样的布尔值,而是一个数字值。我想返回那些contactaccepted或iaccepted值为true的userID。 - Sumit Aggarwal
在JavaScript中,与0不同或非空字符串的数字是“真实”的值:http://james.padolsey.com/javascript/truthy-falsey/ - Shanoor
Shan,请理解我有一个JSON数据,其中有许多与contactaccepted true和i accepted true相关的值。现在,我必须过滤这些变量值都为true的ID。我使用map函数来检查。我的主要问题是,如果条件值为true,则ID将返回到数组中,但是如果条件值为false,则我不想在这种情况下添加任何返回值,undefined将自动添加到列表中,因此我使用return false。现在结果类似于[34,56,false,74],但我不想要这个,我想要[34,56,74],else语句中不会返回任何内容。 - Sumit Aggarwal

-1

不确定这是否是您要找的内容:

var arr = [true,true,false,true,false];


var result = arr.map(function(val,ind,arr){

        if(val === !false){
          return val
        }
})

console.log(result) // true, true , true

https://jsfiddle.net/horonv8a/


我不想返回值,我需要跳过那些当前不符合条件的值,无论是true还是false值都插入到数组元素中。 - Sumit Aggarwal
这不会跳过 false 值... 在这种情况下,我喜欢使用 reduce - 0zkr PM

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