2013-05-10 75 views
2

为什么null未添加到我的keys数组之下?将空值映射到数组

HTML

<input type="radio" data-codekey="1"/> 
<input type="radio" data-codekey="null"/> 

JS

$(function(){ 

    var keys = $step.find('input[type="radio"]').map(function (i, el) { 

     return $(el).data('codekey'); 

    }).get(); 

console.log(keys); // [1] 
//desired result: [1, null] 

}); 

http://jsfiddle.net/Mewem/

回答

9

the .map() documentation

如果该函数返回null或undefined,则不会插入任何元素。

.data()函数执行类型转换和(显然)假设字符串"null"应转换为值null。它还将字符串"1"转换为数字1

使用.attr()代替.data(),你会得到实际的字符串"null":如果你想要一个实际null不能使用.map()

return $(el).attr('data-codekey'); 

,你必须有.each()循环重写一遍什么:

var keys = []; 
$step.find('input[type="radio"]').each(function() { 
    keys.push($(this).data('codekey')); 
}); 
+0

是的,我就手动推动他们的结果数组:

$([ null, null, null, 1, null]).map(function (i, el) { return [ el ]; }).get(); 

获取此结果()'。谢谢 – Johan 2013-05-10 10:09:53

+1

对于使用ES6 Array.map的用户来说,它的功能与这个答案不一样。返回falsey将添加到数组中。 – LessQuesar 2016-03-10 19:48:24

+1

@LessQuesar - 是的,这是关于jQuery的$ .map() - 它保留了其他falsey值,只是不为null或未定义。自从编写这个答案(几年前)以来,我发现使用返回'[null]'的jQuery函数(即返回一个具有null作为元素的数组)将把'null'放入新数组中。或者使用.call()或.apply()将本地.map()与jQuery对象一起使用。 – nnnnnn 2016-03-10 21:19:01

1

过了一年之后,似乎要么东西都与地图改变()或原来的答案错过了docs

该函数可以返回:

  • 翻译值,其将被映射到所得到的阵列
  • null或未定义,删除的项
  • 值的阵列,这将被展平到全阵列

溶液这里是最近子弹:只需返回一个包含单个元素的数组,即使它是null。阵列都将展开到的结果,并且空值将不会被删除:使用`每个

[ null, null, null, 1, null ] 
+0

当您参考文档时,您应该参考正确的地图方法:http://api.jquery.com/map/ – Johan 2014-11-06 20:04:08