5

我有以下对象

{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]

如何改进我的代码?
谢谢

4

6 回答 6

9

您实际上想使用_.pickand _.values

_.values( _.pick( obj, "one", "two" ) )
于 2012-05-24T07:42:14.573 回答
3

我不认为有内置的可能性(例如,在中你可以使用flatMap它)。在中考虑链式mapfilter

_({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();

更新(根据@ZacharyK评论):或使用reject补充filter

reject(function(num) {
  return num === undefined
})
于 2012-05-24T07:38:29.283 回答
2

其他答案将涉及(至少)两个循环通过对象的长度。你真正想要的是_.reduce

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

这会给你你的答案,就像你喜欢的那样压缩,只需要一个循环通过你的对象。

于 2015-01-13T22:31:34.027 回答
2

Another option to do this in two steps, first map then compact

Example:

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

myArray = _.compact(myArray)

This solution works better for arrays than objects.

_.compact(array):

Returns a copy of the array with all falsy values removed. In JavaScript, false, null, 0, "", undefined and NaN are all falsy.

于 2012-11-03T22:38:31.877 回答
0

把它分成两个步骤。首先使用过滤器选择您想要的值,然后使用地图获取值

_({..}).chain()
       .filter(function(num, key){
            return key ==='one'||key==='two';
        })
       map(function (num,key){
            return num;
       }).values()
于 2012-05-24T07:39:22.247 回答
-1

你为什么不使用:

_.map(['one','two'], function(key) { return obj[key]; });

评估为[1, 2]

请参阅(尽管由于节点 repl 我必须将下划线别名为__):

> var __ = require('underscore');
> var obj = {one : 1, two : 2, three : 3};
> __.map(['one','two'], function(key) { return obj[key]; });
[ 1, 2 ]
于 2012-05-24T07:39:59.440 回答