jQuery .map()返回没有未定义

时间:2014-09-18 20:31:44

标签: javascript jquery arrays map

我有一个对象数组,我想创建一个仅包含id的新数组。有些记录有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/

3 个答案:

答案 0 :(得分:11)

只有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

答案 1 :(得分: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/

答案 2 :(得分:0)

正如其他人所说,如果你坚持使用纯粹的jQuery,你唯一的选择就是将mapfilter结合起来,或者自己对地图结果进行后处理。

但是,如果将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();