web-dev-qa-db-ja.com

Underscore.jsでオブジェクトから空のプロパティ/偽の値を削除します

いくつかのプロパティを持つオブジェクトがあります。偽の値を持つプロパティを削除したいと思います。

これは、配列で compact で実現できますが、オブジェクトはどうでしょうか?

81
user1082754

独自のアンダースコアプラグイン(mixin)を作成できます。

_.mixin({
  compactObject: function(o) {
    _.each(o, function(v, k) {
      if(!v) {
        delete o[k];
      }
    });
    return o;
  }
});

そして、それをネイティブアンダースコアメソッドとして使用します。

var o = _.compactObject({
  foo: 'bar',
  a: 0,
  b: false,
  c: '',
  d: null,
  e: undefined
});

更新

@ AndreiNecula指摘 のように、このミックスインは元のオブジェクトに影響し、元のcompactアンダースコアメソッド 配列のコピーを返します
この問題を解決し、compactObjectcousinのように動作させるために、ここにマイナーアップデートを示します。

_.mixin({
  compactObject : function(o) {
     var clone = _.clone(o);
     _.each(clone, function(v, k) {
       if(!v) {
         delete clone[k];
       }
     });
     return clone;
  }
});
47
gion_13

Underscoreバージョン1.7.0以降では、 _.pick を使用できます。

_.pick(sourceObj, _.identity)

説明

_.pickの2番目のパラメーターは、値を選択するための述語関数にすることができます。述語が返す値truthyが選択され、述語が返す値falsyは無視されます。

pick_.pick(object、* keys)

objectのコピーを返し、ホワイトリストに登録されたkeys(または有効なキーの配列)。または、選択するキーを示す述語を受け入れます。

_.identityは、最初の引数を返すヘルパー関数です。つまり、真実の値を選択し、偽の値を拒否する述語関数としても機能します。 Underscoreライブラリには、他の多くの述語も付属しています。たとえば、_.pick(sourceObj, _.isBoolean)はブール型プロパティのみを保持します。

この手法を頻繁に使用する場合は、もう少し表現力を豊かにすることをお勧めします。

var pickNonfalsy = _.partial(_.pick, _, _.identity); // Place this in a library module or something
pickNonfalsy(sourceObj);

アンダースコアバージョン1.6.0は_.pickも提供していましたが、ホワイトリストの代わりに述語関数を受け入れませんでした。

166
Emil Lundberg

クイックアンドクリア:_.omit( source, i => !i );

これは、エミルの答えと逆の形で述べられています。このようにして、私見はより明確になります。より自明です。

ES6の豪華さがない場合は、クリーン度がやや劣ります:_.omit( source, function(i){return !i;});

代替:_.omit( source, _.isEmpty)

_.isEmptyを使用して、真実性のために_.identityの代わりにまた、空の配列とオブジェクトをコレクションから便利に削除し、おそらく不便な数字と日付を削除します。したがって、結果はOPの質問に対する正確な答えではありませんが、空のコレクションを削除する場合に役立ちます。

43
Shwaydogg

Lodashの transform を使用すると、

_.transform(obj, function(res, v, k) {
  if (v) res[k] = v;
});
21
raine
Object.keys(o).forEach(function(k) {
    if (!o[k]) {
        delete o[k];
    }
});
17

浅いクローンを作成できます。

_(obj).reduce(function(a,v,k){ 
     if(v){ a[k]=v; } 
     return a; 
},{});
9
webwise

オブジェクト使用の削除。

for(var k in obj){

  if(obj.hasOwnProperty(k) && !obj[k]){
    delete obj[k];
  }
}
5
Anoop

突然、改ざんを削除する関数を作成する必要がありました。これがお役に立てば幸いです。 Lodashを使用しています。

var removeFalsies = function (obj) {
    return _.transform(obj, function (o, v, k) {
        if (v && typeof v === 'object') {
            o[k] = _.removeFalsies(v);
        } else if (v) {
            o[k] = v;
        }
    });
};

_.mixin({ 'removeFalsies': removeFalsies });

その後、それを使用できます。

var o = _.removeFalsies({
  foo: 'bar',
  a: 0,
  b: false,
  c: '',
  d: null,
  e: undefined,
  obj: {
    foo: 'bar',
    a: 0,
    b: false,
    c: '',
    d: null,
    e: undefined
  }
});

// {
//   foo: 'bar',
//   obj: {
//     foo: 'bar'
//   }
// }
4
Marco Godínez

Gion_13の回答に追加するには:

_.mixin({
  compactObject : function(o) {
     var newObject = {};
     _.each(o, function(v, k) {
       if(v !== null && v !== undefined) {
         newObject[k] = v
       }
     });
     return newObject;
  }
});

これは、すべてを複製してキーと値のペアを削除する代わりに、新しいオブジェクトを作成し、キーと値を追加します。わずかな違い。

しかしより重要なことは、falseyの代わりにnullとundefinedを明示的にチェックすることです。これにより、値としてfalseを持つキーと値のペアが削除されます。

1
Geoff Lee

lodashでは、次のようにします。

_.pickBy(object, _.identity);
0
Hydrogen