web-dev-qa-db-ja.com

lodashを使用して、真の値を持つJSオブジェクトのプロパティを検索します

次のようなオブジェクトがあるとしましょう:

var foo = {
    alpha: true,
    beta: false,
    gamma: true
}

_.findKeyを使用して、真の値を持つ1つのキーを取得できますが、真の値を持つすべてのキーを含む配列を取得したいのですが。例えば。

_.findAllKeys(foo, function(val) { return val; });
// yields -> ["alpha", "gamma"]

これを行うための関数を書くのは簡単ですが、findKeyの明らかな一般化のように思われるので、私はそれを見逃しているに違いないと思います。 lodashにはそのような機能がありますか?

10
Asmor
var foo = {
    alpha: true,
    beta: false,
    gamma: true
};

var t1 = _.keys(_.pick(foo, _.identity));
console.log(t1);

var t2 = _(foo).pick(_.identity).keys().value();
console.log(t2);
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js"></script>
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

編集:
@ backdeskが指摘しているように、_.pickが分割されたため、_.pickByはlodash4では機能しなくなりました。

var foo = {
    alpha: true,
    beta: false,
    gamma: true
};

var t1 = _.keys(_.pickBy(foo, _.identity));
console.log(t1);

var t2 = _(foo).pickBy(_.identity).keys().value();
console.log(t2);

// _.pickBy defaults to _.identity

var t3 = _.keys(_.pickBy(foo));
console.log(t3);

var t4 = _(foo).pickBy().keys().value();
console.log(t4);
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.8.2/lodash.min.js"></script>
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
20
DTing

ぎこちなくてエレガントな答えを見つけました。

var foo = {
    alpha: true,
    beta: false,
    gamma: true
};
_.invert(foo, true).true

// yields -> ["alpha", "gamma"]
7
Asmor

pickBy loDashでは、デフォルトで_.identityを使用してプロパティをフィルタリングするため、次のように使用できます。

_.pickBy({'a': undefined, 'b':1, c:{}});

// => Object {b: 1, c: Object}
3
Adam

pickメソッドを探していると思います。

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

var foo = {
    alpha: true,
    beta: false,
    gamma: true
};

var picked = _.pick(foo, function(value) { return value; });
console.log(picked);

$('#output').html(JSON.stringify(picked));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.js"></script>
<div id="output">
</div>
1
AWolf

私は個人的に次のことを好みます-それはより冗長ですが-それが何をするのかがより明白だと思うので。ただし、es6構文が必要です。

_.toPairs(foo)
  .filter([key, value] => value)
  .map([key, value] => key);

ESLintで未使用の変数が許可されていない場合は、たとえば.eslint.ymlで次を使用できます。

rules:    
  no-unused-vars:
    - 2
    - vars: all
      args: after-used
      argsIgnorePattern: _$

書くことができます

_.toPairs(foo)
  .filter([key_, value] => value)
  .map([key, value_] => key);

ちょうど試して

var foo = {
    alpha: true,
    beta: false,
    gamma: true
}

_.pickBy(foo、_。identity);

0
Walter Zalazar

LodashでpickBy()を使用して、値がtrueに等しいキーを取得できます。

const active = _.keys(_.pickBy(foo));

または、次を使用することもできます。

var active = _.keys(foo).filter(function (id) {
    return foo[id]
});
0
Subrata Sarkar