1

我有一个对象数组,我只想在它通过条件时保存一个子对象。目前我第一次使用map然后filter结果:

   var a = _.filter(
    _.map(activities.toJSON(), function (activity) {
    if (activity.verb !== 'test') {
      return activity.object;
    }
  }), function(b){return b;});

这似乎有点奇怪。有一个更好的方法吗。

4

3 回答 3

4

你可以试试#reduce

_.reduce(activities.toJSON(), function(accum, activity){
  if (activity.verb !== 'test')
    accum.push(activity.object);
  return accum;
}, []);

例子

于 2012-08-30T13:32:15.267 回答
2

任何时候你开始做类似的事情_.f(_.g(...)),你都应该考虑使用_.chain. 你可以这样做:

var a = _.chain(activities.toJSON())
         .select(function(a) { return a.verb !== 'test' })
         .map(function(a) { return a.object })
         .value();

我还调整了您的逻辑以简化事情,无需两次进行相同的测试。如果将函数放入变量中,则可以使这种事情变得非常可读:

var not_tests   = function(a) { return a.verb !== 'test' };
var extract_obj = function(a) { return a.object };
var results     = _.chain(activities.toJSON())
                   .select(not_tests)
                   .map(extract_obj)
                   .value();

演示:http: //jsfiddle.net/ambiguous/EQfuH/

使用这种方法会有相当多的复制,因此您可能只想走老路并使用循环:

var json = activities.toJSON();
var a    = [ ];
for(var i = 0; i < json.length; ++i)
    if(json[i].verb !== 'test')
        a.push(json[i].object);

JavaScript 中的循环没有任何问题。

于 2012-08-30T18:38:56.587 回答
1

我想你正在寻找_.compact()

var a = _.compact(
    _.map(activities.toJSON(), function (activity) {
    if (activity.verb !== 'test') {
      return activity.object;
    }
  }));

另一种方法,我认为在语义上有点好,是过滤掉你不想要的,然后使用_.pluck

var a = _.filter(activities.toJSON(), function (activity) {
    return activity.verb !== 'test';
}).pluck('object');
于 2012-08-30T18:45:10.710 回答