【问题标题】:jQuery .map() returning without undefinedjQuery .map() 返回没有未定义
【发布时间】:2014-09-18 20:31:43
【问题描述】:
我有一个对象数组,我想用ids 创建一个新数组。有些记录有id,有些则没有。
所以我有类似的东西:
var myMap = arr.map(function(e) {
return e.id;
});
console.log(myMap); // [undefined, 2, 3, 4]
如果可能,我希望它只返回 [2, 3, 4]。
这个 JSFiddle 应该解释得更好一点:http://jsfiddle.net/dmathisen/Lnmj0w8k/
【问题讨论】:
标签:
javascript
jquery
arrays
map
【解决方案1】:
仅使用 Array.map 是不可能的,您还必须进行过滤。
var myMap = arr.map(function(e) {
return e.id;
}).filter(function(x) {
return typeof x !== 'undefined';
});
由于 ID 始终是字符串,因此您也可以这样做
var myMap = arr.map(function(e) {
return 'id' in e ? e.id : false;
}).filter(Boolean);
FIDDLE
【解决方案2】:
var myMap = arr.filter(function(e) {
return e.hasOwnProperty("id")
}).map(function(e) {
return e.hasOwnProperty("id") ? e.id : null;
});
http://jsfiddle.net/Lnmj0w8k/11/
【解决方案3】:
正如其他人所说,如果您坚持使用纯 jQuery,您唯一的选择是将您的 map 与 filter 结合起来,或者自己对地图结果进行后处理。
但是,如果将 jQuery 与流行的 Underscore.js 库结合使用,由于 Underscore 的紧凑方法,问题变得微不足道:
var myMap = arr.map(function(e) {
return e.id;
});
myMap = _(myMap).compact();
但是如果你使用 Underscore,还有一种更简单的方法来做同样的事情,因为 Underscore 有一个专门用于从对象中提取某个属性的方法:
var myMap = _(arr).pluck('id');
myMap = _(myMap).compact();
您甚至可以将两者链接在一起:
var myMap = _(arr).chain().pluck('id').compact().value();
或者您可以加入 Underscore Grease 库以获得我认为最简单的解决方案:
var myMap = _(arr).pluck_('id').compact();