Javascript 关于下划线.map

Javascript 关于下划线.map,javascript,underscore.js,scala,backbone.js,Javascript,Underscore.js,Scala,Backbone.js,我有以下目标 {one : 1, two : 2, three : 3} 我想 [1,2] 这是我的密码 _.map({one : 1, two : 2, three : 3}, function(num, key){ if (key==='one' || key==='two') { return num; } }); // [1, 2, undefined] 实际上我想要[1,2] 如何改进代码? 谢谢我认为这是不可能的

我有以下目标

{one : 1, two : 2, three : 3}
我想

[1,2]
这是我的密码

_.map({one : 1, two : 2, three : 3}, function(num, key){ 
         if (key==='one' || key==='two') {
             return num;
         } 
}); // [1, 2, undefined]
实际上我想要
[1,2]

如何改进代码?

谢谢

我认为这是不可能的(例如,在中,您可以使用
flatMap
)。在考虑链式<代码> map < /C>和<代码>过滤器< /代码>:

_({one : 1, two : 2, three : 3}).
  chain().
  map(function(num, key){ 
    if (key==='one' || key==='two') {
      return num;
    }
  }).
  filter(function(num) {
    return num !== undefined
  }).
  value();
reject(function(num) {
  return num === undefined
})
更新(根据@ZacharyK注释):或使用
拒绝
补充
过滤器

_({one : 1, two : 2, three : 3}).
  chain().
  map(function(num, key){ 
    if (key==='one' || key==='two') {
      return num;
    }
  }).
  filter(function(num) {
    return num !== undefined
  }).
  value();
reject(function(num) {
  return num === undefined
})

把它分成两步。首先使用过滤器选择所需的值,然后使用映射获取值

_({..}).chain()
       .filter(function(num, key){
            return key ==='one'||key==='two';
        })
       map(function (num,key){
            return num;
       }).values()
你为什么不使用:

_.map(['one','two'], function(key) { return obj[key]; });
其计算结果为
[1,2]

请参阅(尽管由于节点repl,我不得不将下划线别名为
\uuuu
):

您实际上想要使用和:


另一个选项分两步完成,首先
map
然后

例如:

myArray = _.map({one : 1, two : 2, three : 3}, function(num, key){ 
         if (key==='one' || key==='two') {
             return num;
         } 
    });

myArray = _.compact(myArray)
此解决方案适用于阵列而不是对象

_.紧凑型(阵列):

返回已删除所有falsy值的数组副本。在里面 JavaScript、false、null、0、“、undefined和NaN都是false


其他答案将涉及(至少)两个穿过物体长度的环。您真正想要的是

_.reduce({ one : 1, two : 2, three : 3 }, function ( out, num, key ) { 
    if ( key === 'one' || key === 'two' ) {
        out.push( num );
    }
    return out;
}, []);
// [1, 2]

这将为您提供答案,并根据您的喜好进行压缩,只需在对象中进行一次循环。

每隔几个月从头到尾阅读下划线文档是值得的。大量有用的东西。这就是我使用的东西。在
过滤器
方法调用和
映射
之间缺少一个
。这将导致
map
被视为一个单独的函数,而不是被传递的对象的方法。