Underscore.js _.map函数:跳过一个值

时间:2015-06-12 13:33:14

标签: javascript underscore.js

我试图在对象数组上使用underscore.js _.map函数,以获取具有每个对象属性的数组。这是通常的情况,所以:

var finalArray = _.map(myArray, function(obj) {
    return obj.myProperty;
});

但在某些情况下,我需要在数组中添加 nothing 。它可能是这样的:

var finalArray = _.map(myArray, function(obj) {
    if (!obj.ignore) {
        return obj.myProperty;
    }
});

这样做的结果是undefined值被推入数组中,这与不推送任何内容是不一样的。

地图功能是否有办法不推送值,或者我是否需要对finalArray进行后期处理以删除不需要的undefined

7 个答案:

答案 0 :(得分:27)

你应该在_.map()

之前使用_.filter()
set pm3d interpolate 4,4

答案 1 :(得分:26)

您可以使用reduce:

myArray.reduce(function (acc, obj) {
    if (!obj.ignore) {
        acc.push(obj.myProperty);
    }
    return acc;
}, []);

或与lodash:

_.reduce(myArray, function (acc, obj) {
  if (!obj.ignore) {
    acc.push(obj.myProperty);
  }
  return acc;
}, []);

答案 2 :(得分:12)

这可以单独使用Underscore方法完成,points-free style

cmd.Transaction = transaction;

答案 3 :(得分:5)

.map会将新值映射到数组,您可以使用.filter来过滤数组。仅供参考,您可以使用.pluck来映射对象的属性:

_.chain(myArray).filter(function(obj) { return !obj.ignore; }).pluck('myProperty').value();

你也可以像这样使用.where

_.chain(myArray).where({ignore: false}).pluck('myProperty').value();

或者:

_.pluck(_.where(myArray, {ignore: false}), 'myProperty');

答案 4 :(得分:2)

尝试使用lodash的 compact() 。它创建一个删除了所有falsey值的数组。因此,值falsenull0""undefinedNaN将被删除。

https://lodash.com/docs#compact

我正在使用它 - 它很干净。

答案 5 :(得分:1)

所以这意味着你要过滤,然后映射你的数组。

要以underscore的方式执行此操作,您需要将数组传递到此管道中:

  

myArray - > 过滤器 - > 地图 - > finalArray

var isIncluded = function(obj){
    return !obj.ignore
}
var takeProperty = function(obj){
    return obj.myProperty
}
var finalArray = _.map( _.filter(myArray, isIncluded), takeProperty  );

答案 6 :(得分:0)

这是另一种方式。这个使用下划线中的compose函数。为什么要撰写? compose由数学中的类别理论支持。这种方式也是无点的。

var pluckMyProp = function(array) {
    return _.pluck(array, 'myProperty')
}

var reject = function(array) {
    return _.reject(array, function(element) {
        return element['ignore'] === true
    })
}

var finalArray = _.compose(pluckMyProp, reject)
var data = [{myProperty: 1, ignore: false}, {ignore: true}, {myProperty: 2}]


finalArray(data) //=> [1,2]