web-dev-qa-db-ja.com

値に基づくオブジェクトプロパティのフィルタリング

Lodash/underscoreを使用してこのオブジェクトから誤ったプロパティを除外するエレガントな方法はありますか? _.compact(array)が配列から誤った要素を削除する方法に似ています

から

{
  propA: true,
  propB: true,
  propC: false,
  propD: true,
}

戻る

{
  propA: true,
  propB: true,
  propD: true,
}
16
user3598395

Lodash 4.0より前

_.pickが必要です。これは関数を引数として取り、その関数がtrueを返すキーのみを含むオブジェクトを返します。だからあなたはできる:

filtered = _.pick(obj, function(value, key) {return value;})

またはもっと簡潔に:

filtered = _.pick(obj, _.identity)

ロダッシュ4.0

Lodash 4.0は、_.pick関数を、プロパティの配列を取る_.pickと、関数を取る_.pickByに分割しました。だから今は

filtered = _.pickBy(obj, function(value, key) {return value;})

または、_.pickByは2番目の引数としてデフォルトで_.identityを使用するため、次のように記述できます。

filtered = _.pickBy(obj);
24
Retsam

バニラのjavascriptオプションは次の2つです。

A.:オブジェクトのキーと delete 誤った値を持つキーを反復します。

_var obj = {
  propA: true,
  propB: true,
  propC: false,
  propD: true,
};

Object.keys(obj).forEach(key => {
  if (!obj[key]) delete obj[key];
});

console.log(obj);_

Object.keys()およびArray.prototype.forEach()を参照してください

B.:オブジェクトのキーを反復処理し、真の値を新しいオブジェクトに追加します。

_var obj = {
  propA: true,
  propB: true,
  propC: false,
  propD: true,
};

var filteredObj = Object.keys(obj).reduce((p, c) => {    
  if (obj[c]) p[c] = obj[c];
  return p;
}, {});

console.log(filteredObj);_

Object.keys()およびArray.prototype.reduce()を参照してください

16
canon

Lodashを使用している場合は、次のようなものをお勧めします。

var object = {
    propA: true,
    propB: true,
    propC: false,
    propD: true,
};

_.pick(object, _.identity);
// →
// {
//   propA: true,
//   propB: true,
//   propD: true
// }

pick() 関数は、コールバックがtruthyを返すためのプロパティを含む新しいオブジェクトを生成します。したがって、各プロパティ値を返すだけなので、コールバックとして identity() 関数を使用できます。

1
Adam Boduch

残念ながら、まだ上記の投稿に直接コメントすることはできないため、この追加の投稿を作成します。

Lodash v4以降、上記の機能は _。pickBy に移動しました。 _.identityデフォルトとして、コードを次のように変更することもできます。

var filtered = _.pickBy(obj);

実際の例については、この JSBin を参照してください。

1
Jonas

Lodash 4以降、pickBy()を使用して、trueに等しい値のみを取得できます。

const active = _.keys(_.pickBy(object));
0
Subrata Sarkar