【问题标题】: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

    【讨论】:

    • 感谢Boolean 示例。
    【解决方案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,您唯一的选择是将您的 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();
      

      【讨论】:

        猜你喜欢
        • 2014-04-26
        • 2011-04-17
        • 2021-09-06
        • 2016-12-01
        • 2010-11-29
        • 2020-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多