web-dev-qa-db-ja.com

値がtrueの場合にのみオブジェクトキーを返す

値がtrueの場合にのみオブジェクトキー名を返すにはどうすればよいですか?

私はアンダースコアを使用していて、私が見る唯一のことは簡単にキーを返す方法です、私は可能な限り冗長な反復を避けたいです:

例:

Object {1001: true, 1002: false} 

1001だけの配列が欲しい...

16
user3299182

Object.keys オブジェクトからキーを取得し、次のことができます filter 値に基づいてキー

var obj = {1001: true, 1002: false};

var keys = Object.keys(obj);

var filtered = keys.filter(function(key) {
    return obj[key]
});

[〜#〜]フィドル[〜#〜]

28
adeneo

2つの方法を使用して Lodash ライブラリで使用できる別の方法があります。

  • __.pickBy_-オブジェクトのプロパティで構成されるオブジェクトを作成します。追加のパラメーター(述部)がない場合、返されるすべてのプロパティにはtruthy値が含まれます。
  • _.keys(object)-指定されたオブジェクトからキーの配列を作成します

したがって、あなたの例では次のようになります:

_var obj = {1001: true, 1002: false};
var keys = _.keys(_.pickBy(obj));

// keys variable is ["1001"]
_

nderscore.js ライブラリを使用すると、非常によく似たものになります。 __.pick_ および __.keys_ 関数を使用する必要があります。唯一の違いは、__.pick_には述語関数 __.identity_ が必要であることです。

したがって、コードは次のようになります。

_var obj = {1001: true, 1002: false};
var keys = _.keys(_.pick(obj, _.identity));

// keys variable is ["1001"]
_

それが役に立てば幸い

10
Tom

フィルタリングとオブジェクトの繰り返し処理を組み合わせる場合は、通常 _.reduce (スイスアーミーナイフの反復子):

var trues = _(obj).reduce(function(trues, v, k) {
    if(v === true)
        trues.Push(k);
    return trues;
}, [ ]);

デモ: http://jsfiddle.net/ambiguous/2et6T/

4
mu is too short

冗長性が低い:

return array.filter(item => {
    return item.enabled === true;
});
0
Tom Shaw