以下を使用するのではなく、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をご覧ください。
every
、 has
および 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
です。 _.every
はrequiredKeys
配列を繰り返し、現在の値を部分オブジェクトに渡します。これにより、現在の値が部分_.has
関数に適用され、true
またはfalse
が返されます。 _.every
は、配列内のすべての要素が関数オブジェクトに渡されたときにtrue
を返す場合にのみtrue
を返します。上記の例では、すべてのキーがparams
にあるため、true
を返します。その中に単一の要素が存在しない場合でも、false
を返します。
私は質問がlodashに関するものであることを知っていますが、これはVanilla JSで行うことができ、はるかに高速です:
requiredKeys.every(function(k) { return k in params; })
eS2015ではさらにクリーンに:
requiredKeys.every(k => k in params)
_(requiredKeys).difference(_(params).keys().value()).empty()
私は信じている。重要なステップは、すべてを配列に入れてからセットを操作することです。
または
_requiredKeys.map(_.pluck(params).bind(_)).compact().empty()
うまくいくかもしれない。
Paramsが必要以上のプロパティを持つことができると仮定して...
var keys = _.keys(params);
var isCompleteForm = requiredKeys.every(function (key) {
return keys.indexOf(key) != -1;
});
トリックを行う必要があります。