我有一个对象数组,我想创建一个仅包含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/
答案 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);
答案 1 :(得分:2)
var myMap = arr.filter(function(e) {
return e.hasOwnProperty("id")
}).map(function(e) {
return e.hasOwnProperty("id") ? e.id : null;
});
答案 2 :(得分:0)
正如其他人所说,如果你坚持使用纯粹的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();