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

fou*_*deg 30 javascript underscore.js

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

var finalArray = _.map(myArray, function(obj) {
    return obj.myProperty;
});
Run Code Online (Sandbox Code Playgroud)

但在某些情况下,我需要在数组中添加任何内容.它可能是这样的:

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

结果是一个undefined值被推入数组,这与不推送任何东西是不一样的.

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

cou*_*tos 28

你应该在_.map()之前使用_.filter()

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

var finalArray = _.map(filteredArray, function(obj) {
    return obj.myProperty;
});
Run Code Online (Sandbox Code Playgroud)

  • 正如foucdeg描述他的问题,没有必要改变输入来决定是否应该排除它们.过滤****之前**在性能方面更好 (6认同)

Tho*_*ann 28

你可以使用reduce:

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

或者用lodash:

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

  • 我认为这是最好的答案,因为它只是按照@foucdeg的要求循环遍历所有元素"地图函数是否有办法不推送值".答案是使用reduce()而不是map(). (6认同)

Pav*_*vlo 12

这可以单独使用Underscore方法完成,无点样式:

var finalArray = _.chain(myArray)
    .reject('ignore')
    .pluck('myProperty')
    .value();
Run Code Online (Sandbox Code Playgroud)

  • @Pavlo你需要一个带有Underscore的显式`.chain`,你可以简单地使用`.reject('ignore')`而不是`.reject(_.property('ignore'))`.http://jsfiddle.net/nikoshr/2gpvws1u/ (3认同)

and*_*lrc 5

.map将为数组映射一个新值,您可以使用它.filter来过滤数组.您可以使用FYI .pluck从对象映射属性:

_.chain(myArray).filter(function(obj) { return !obj.ignore; }).pluck('myProperty').value();
Run Code Online (Sandbox Code Playgroud)

你也可以.where像这样使用:

_.chain(myArray).where({ignore: false}).pluck('myProperty').value();
Run Code Online (Sandbox Code Playgroud)

要么:

_.pluck(_.where(myArray, {ignore: false}), 'myProperty');
Run Code Online (Sandbox Code Playgroud)