web-dev-qa-db-ja.com

LoDash _.hasは複数のキーに対応

以下を使用するのではなく、lodashで使用可能なオブジェクトにキーの配列が存在するかどうかを確認するメソッドまたはメソッドのチェーンはありますか?

var params = {...}
var isCompleteForm = true;
var requiredKeys = ['firstname', 'lastname', 'email']

for (var i in requiredKeys) {
    if (_.has(params, requiredKeys[i]) == false) {
        isCompleteForm = false;
        break;
    }
}

if (isCompleteForm) {
    // do something fun
}

[〜#〜] update [〜#〜]

素晴らしいソリューションを提供してくれたみんなに感謝します!興味のある方は、さまざまなソリューションのjsPerfをご覧ください。

http://jsperf.com/check-array-of-keys-for-object

24
YarGnawh

everyhas および partial functionsを使用すると、完全に機能するようになります。

var requiredKeys = ['firstname', 'lastname', 'email'],
    params = {
        "firstname": "thefourtheye",
        "lastname": "thefourtheye",
        "email": "NONE"
    };
console.log(_.every(requiredKeys, _.partial(_.has, params)));
// true

部分的な関数オブジェクトを_.everyに渡します。これは実際にはparamsオブジェクトに部分的に適用される_.hasです。 _.everyrequiredKeys配列を繰り返し、現在の値を部分オブジェクトに渡します。これにより、現在の値が部分_.has関数に適用され、trueまたはfalseが返されます。 _.everyは、配列内のすべての要素が関数オブジェクトに渡されたときにtrueを返す場合にのみtrueを返します。上記の例では、すべてのキーがparamsにあるため、trueを返します。その中に単一の要素が存在しない場合でも、falseを返します。

27
thefourtheye

私は質問がlodashに関するものであることを知っていますが、これはVanilla JSで行うことができ、はるかに高速です:

requiredKeys.every(function(k) { return k in params; })

eS2015ではさらにクリーンに:

requiredKeys.every(k => k in params)
42
Allan Baptista
_(requiredKeys).difference(_(params).keys().value()).empty()

私は信じている。重要なステップは、すべてを配列に入れてからセットを操作することです。

または

_requiredKeys.map(_.pluck(params).bind(_)).compact().empty()

うまくいくかもしれない。

3
djechlin

Paramsが必要以上のプロパティを持つことができると仮定して...

var keys = _.keys(params);
var isCompleteForm = requiredKeys.every(function (key) {
    return keys.indexOf(key) != -1;
});

トリックを行う必要があります。

2
irysius