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

Underscore.js _.map function : skip a value

我正在尝试对对象数组使用 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 值被推入数组,这与根本没有推入任何东西是不一样的。

有没有办法让 map 函数不推送值,或者我是否需要 post- 处理我的 finalArray 以删除不需要的 undefined

你应该在 _.map()

之前使用 _.filter()
var filteredArray = _.filter(myArray,function(obj) {
     return !obj.ignore;
});

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

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

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

myArray --> filter --> map --> finalArray

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

.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');

你可以使用 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;
}, []);

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

var finalArray = _.chain(myArray)
    .reject('ignore')
    .pluck('myProperty')
    .value();

这是另一种方式。这个使用了下划线中的 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]

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

https://lodash.com/docs#compact

我正在用它——非常干净。