私は次のような状況にいます:
関数に渡されたオブジェクト パラメーターが有効かどうかを確認する必要があります。
例:
function (opt) {
if (opt && opt.key && opt.key2) {
// make something
}
}
この種のチェックを行うためのより良い方法はありますか?
私は次のような状況にいます:
関数に渡されたオブジェクト パラメーターが有効かどうかを確認する必要があります。
例:
function (opt) {
if (opt && opt.key && opt.key2) {
// make something
}
}
この種のチェックを行うためのより良い方法はありますか?
プロパティ名のリストを指定してオブジェクトを検証する単純なテスト ルーチンを作成するだけです。
// usage: testProps(object to test, [list, of, property, names])
// returns true if object contains all properties
function testProps(obj, props)
{
if (obj === null)
return false;
var i;
for (i=0; i<props.length; ++i)
{
if (!(props[i] in obj))
return false;
}
return true;
}
そして、あなたの機能で:
if (!testProps(obj, ['key', 'key2'])
return;
あまり。
あなたが使用できない限りopt.pleaseReadMyMind()
;-)
ただし、すべてのフィールドの値が と異なるかどうかを確認するメソッドを作成できますnull
。
それが最もコンパクトな方法です。
最も正しい方法は次のとおりです。
if( typeof opt !== "undefined" && typeof opt.key !== "undefined" && typeof opt.key2 !== "undefined") {
しかし、おわかりのように、これはかなりの量であり、実際には必要ありません。
あなたがしていることは有効ですが、欠陥があります。
if (opt && opt.key && opt.key2) {
誤った値 [0、null、false など]opt.key
がある場合、このチェックは失敗します。
その場合、未定義でないことを確認するために typeof チェックを行う必要があります。
if (opt && typeof opt.key !== "undefined" && opt.key2) {
あなたはいつでも次のようにすることができます:
function validate(o, args) {
if (typeof(o) == 'object' && args instanceof Array) {
for (var i = args.length - 1; i >= 0; --i) {
if (typeof(o[args[i]]) === 'undefined') return false;
}
return true;
} else {
return false;
}
}
function myFunction(obj) {
if (validate(obj, ['foo', 'bar'])) {
// Your code goes here.
} else {
// Object passed to the function did not validate.
}
}
ここにフィドルがあります:http://jsfiddle.net/reL2g/
ええ、でも3つだけではなく、チェックするキーがたくさんある場合にのみ「より良い」です。このようなもの:
function opt(opt) {
for(var i = 0; i<3; i++) {
if(typeof opt["key"+((i > 0) ? "" : i + 1))] === "undefined") {
return;
}
}
// create object
}
が未定義の場合opt
、そのすべてのキーも未定義になるため、それに対する暗黙のチェックもあります。
次のように、チェックする変数名を配列で定義することもできます。
var propsToCheck = ["key", "key1", "key2"];
function(opt) {
for(var i = 0, ii = propsToCheck.length; i<ii; i++) {
if(typeof opt[propsToCheck[i]] === "undefined") {
return;
}
// create object
}
}
それほど優れたソリューションではありませんが、3 つまたは 4 つを超えるプロパティをチェックする予定がある場合は、入力を減らすことができます。