1

条件を通過したときにのみサブオブジェクトを保存したいオブジェクトの配列があります。現時点では、最初に使用mapfilterてから結果を使用します。

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

また、ロジックを調整して単純化したので、同じテストを2回行う必要はありません。関数を変数に入れると、この種のものを非常に読みやすくすることができます。

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 に答える