87

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

これはcompactonarrayで実現できますが、オブジェクトについてはどうでしょうか。

4

12 に答える 12

171

アンダースコアバージョン1.7.0以降、次を使用できます_.pick

_.pick(sourceObj, _.identity)

説明

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

pick _.pick(object、* keys)

ホワイトリストに登録されたキー(または有効なキーの配列)の値のみを持つようにフィルター処理された、オブジェクトのコピーを返します。または、選択するキーを示す述語を受け入れます。

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

この手法を頻繁に使用する場合は、もう少し表現力を高めたいと思うかもしれません。

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

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

于 2014-10-10T08:45:44.470 に答える
48

あなたはあなた自身のアンダースコアプラグイン(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
});

アップデート

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

_.mixin({
  compactObject : function(o) {
     var clone = _.clone(o);
     _.each(clone, function(v, k) {
       if(!v) {
         delete clone[k];
       }
     });
     return clone;
  }
});
于 2012-12-27T17:08:14.537 に答える
46

クイック'nクリア:_.omitBy( source, i => !i );

これは、エミルの答えとは逆の方法で述べられています。このようにして、imhoはより明確に読みます。それはもっと自明です。

ES6の贅沢がない場合は、少しきれいではありません。_.omitBy( source, function(i){return !i;});

代わりの:_.omitBy( source, _.isEmpty)

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

于 2015-09-03T22:23:16.527 に答える
21

lodashの変換で、

_.transform(obj, function(res, v, k) {
  if (v) res[k] = v;
});
于 2014-05-17T07:13:22.280 に答える
19
Object.keys(o).forEach(function(k) {
    if (!o[k]) {
        delete o[k];
    }
});
于 2012-12-27T16:55:59.840 に答える
9

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

_(obj).reduce(function(a,v,k){ 
     if(v){ a[k]=v; } 
     return a; 
},{});
于 2013-11-03T07:35:40.950 に答える
5

オブジェクトの場合は削除します。

for(var k in obj){

  if(obj.hasOwnProperty(k) && !obj[k]){
    delete obj[k];
  }
}
于 2012-12-27T16:55:35.303 に答える
5

突然、再帰的に偽りを取り除く関数を作成する必要がありました。これがお役に立てば幸いです。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'
//   }
// }
于 2015-04-10T22:55:01.423 に答える
1

gion_13の答えに追加するには:

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

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

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

于 2015-02-06T00:46:41.787 に答える
1

pickBylodashから使用する必要があります。

pickByのデフォルトの署名は_.(sourceObj, [_.identity])、空のプロパティを削除するためです。

_.pickBy(sourceObj);
于 2021-01-20T07:20:55.577 に答える
0

lodashであなたはこれが好きです:

_.pickBy(object, _.identity);
于 2018-09-03T09:09:04.203 に答える
-1

_.compactアレイで使用するために文書化されていますが。オブジェクトに対しても機能するようです。Chrome、Opera、Firefoxのコンソールで次のコマンドを実行しました。

var obj = {first: 1, second: null, third: 3, fourth: function(){return 5}}
undefined
_.compact(obj)

[1, 3, function()]

更新:サンプルが示すよう_.compactに、オブジェクトを呼び出すとキーが削除され、圧縮された配列が返されます。

于 2016-05-30T19:00:35.470 に答える