2011-01-31 8 views
4

私は、さまざまな数のパラメータを持つJSオブジェクトを持っています。この特定の時間にどのパラメータが渡されたかを確認する方法はありますか?javascript:すべてのオブジェクトパラメータを取得

例:

function getElement() { 
    var scope = document; 

    this.by = function(data){ 
     if (data.id) scope = scope.getElementById(data.id); 
     if (data.tag) scope = scope.getElementsByTagName(data.tag);  
     return scope; 
    } 
} 

そしてそう

var x = new getElement(); 
vad div = x.by({id : "chosenID"}); 

はidを持つdiv要素chosenID

または

var x = new getElement(); 
vad inputs = x.by({id : "chosenID", tag : "input"}); 

は、すべての01を取得し得るように、私はそれを実行ID:chosenIDのdivの;

私は1つまたは2つのパラメータを渡したかどうか知りたいです。

ありがとうございます!

ps:私の助けに感謝しますが、これは学習目的のみのためのjQueryや他のJSフレームワークをsuggetしないでください。とても義務づけられた、ソーリン。

答えて

5

のように、渡されたオブジェクトのパラメータを反復するfor … inループを使用します。

var prop; 

for (prop in data) { 
    if (data.hasOwnProperty(prop)) { 
     // do something with data[prop] 
    } 
} 

hasOwnPropertyでプロパティをチェックすることを忘れないでください。

+0

これは 'for(var prop in data)'であるべきですか? –

+0

@SamSelikoffいいえ、 'prop'はすでに' var'を使ってローカルスコープで宣言されています。 –

+0

ああ、2つの方法に違いはありますか? –

1

オブジェクトの反復(key in data)と配列の結合を使用すると、いくつかの要素を返すことができます...オブジェクトの反復は、switchステートメントによってかなり役に立たなくなります。代わりに、私はいくつかの特定のケースをカバーします、だから、

function getElement() { 
    var scope = document; 
    this.by = function(data){ 
     var key; 
     var ret=[]; 
     for (key in data) { 
      if(data.hasOwnProperty(key)) { 
      switch(key) { 
       case "id": 
       ret=ret.concat(scope.getElementById(data[key])); 
       break; 
       case "tag": 
       ret=ret.concat(scope.getElementsByTagName(data[key])); 
       break; 
       default: 
       throw new Error("Unknown property "+key); 
      } 
      } 
     } 
     return ret; 
    }; 
} 
+0

ありがとう、Rudu! –

1

良い一般回答の多くがありますが、しかし、これを考慮してください。 まず第一に、私は一般的に開始します。

function f (x) { 
    x = x || {} // so f() will be accepted as per f({}) 
    ... 
} 

これはまた、次のためのコンテキストを設定します。

私の通常の方法は、真理値yの値をチェックすることです。真の値は「供給」を意味します。しかし、これには、0または "'を"供給 "として扱わないという欠点があります。

if (x.id) { 
    // x.id is any truth-y 
} 

0が受け付けた入力の場合、非undefined値は「供給された」と考えられるように、私はチェックを広げます。未設定のプロパティのデフォルト値は常にundefinedです。 (このメソッドは0、 ""、nullなどのすべての真理値y値とfalse-y値を受け入れます)。

if (x.id !== undefined) { 
    // x.id is all truth-y and all-but-undefined false-y 
} 

undefinedが受け付けた入力(I強くに対して主張)である場合には、チェックがhasOwnPropertyに基づくことができます。これは[[prototype]]チェインをチェックしないという利点がありません。

if (x.hasOwnProperty("id")) { 
    // x.id set to something, including undefined 
} 

for(..in..)構築物はまた、(それらが特別に隠されていない限り[[prototype]]のプロパティを含む)オブジェクトのプロパティを反復処理するために使用することができます。しかし、入力を扱う一般的なケース(JSONライブラリを作成しないなど)では、上記のメソッドの1つで入力オブジェクトのプロパティを処理するだけで簡単でクリーンです。

+0

うわー、詳細な答えをありがとう、それは本当に私を助けた! –

関連する問題