0

次の2つのコードが必要です
1)「example」で始まるすべての変数を選択する
コード2)「available」の値として「true」を持つすべての変数を選択するコード

example1= {price:1000, size: 1000, available:true}
example2= {price:2000, size: 2000, available:false}
example3= {price:3000, size: 3000, available:true}
example4= {price:4000, size: 4000, available=true}

これは私がコード1で達成したいことです。変数がたくさんあるので、私はそれを行うための迅速な方法が必要です:

var allexampleprices=[example1.price, example2.price, example3.price, example4.price]

2番目のコードでは、値「false」を含む変数のすべての名前を含む配列を取得したいと思います。

助けていただければ幸いです。

4

3 に答える 3

1

あなたが関数にいないと仮定すると、これらはすべてまったく同じものです。

var myVar       = 7;
window.myVar    = 7;
window["myVar"] = 7;

したがって、window [insertString]メソッドを使用して、任意のグローバル変数(関数の外部で定義された変数)にアクセスできます。ウィンドウオブジェクトのすべてのプロパティを検索して、exampleという名前のプロパティを見つけたい場合は、次のようにします。

for( var k in window ){
  if(/example/.test(k)){
    var myExample = window[k];
    // Do stuff
  }
}

ただし、多くの理由から、この方法を強くお勧めします。まず、グローバルスコープに何かを入れるのはひどく悪い習慣です。変数は、大きなプロジェクトの至る所で衝突し始めます。また、ウィンドウオブジェクトには非常に多くのプロパティがあり、それらすべてを検索するとパフォーマンスが大幅に低下します。

以上のことをすべて述べた上で、ヘルパー関数を含めて、実行する必要があることの例を考案しました。

var objects =
{
  example1:
  {
    price: 1000,
    size: 1000,
    available: true
  },

  example2:
  {
    price: 2000,
    size: 2000,
    available: false
  },

  example3:
  {
    price: 3000,
    size: 3000,
    available: true
  },

  example4:
  {
    price: 4000,
    size: 4000,
    available: true
  }
}

function filter(obj, comparator){
  var list = [];
  for(var k in obj){
    if(obj.hasOwnProperty(k)){ // fix for IE
      if(comparator(obj[k], k, obj)) list.push(obj[k]);
    }
  }
  return list;
}

function isExample(obj, key){
  if(/^example/.test( key.toLowerCase() )) return true;
}

function isAvailable(obj){
  if(obj.available) return true;
}

/**
 * And here's how you use it
 */

var examples  = filter(objects, isExample);
var available = filter(objects, isAvailable);

var availableExample = filter(examples, isAvailable);

フィルタ関数は、一致するすべてのオブジェクトの配列を返します。

- - 編集 - -

コンソール内のオブジェクトの名前を言う必要があります。私はあなたが意味しているのは、コンソールが現在[オブジェクト、オブジェクト、オブジェクト、オブジェクト]を表示しているということだと思います。これを行うには2つの方法があります。

(1)オブジェクト自体に名前を入れます

example1:
{
  name: "example1",
  price: 1000,
  size: 1000,
  available: true
}

(2)フィルター操作で名前をキャプチャします

var names = [];
var examples  = filter(objects, function(obj, name){
  if(/^example/.test( name.toLowerCase() )){
    names.push(name);
    return true;
  }
});

console.log(names);
于 2013-01-23T06:06:26.623 に答える
0

次の行は、いくつかの論理コードによって生成されているようです。var example1 = {価格:1000、サイズ:1000、利用可能:true}

Q-1の解決策を提供する別の配列に変数名を単純に格納しないのはなぜですか。

次に、すべての変数(配列)を簡単にトラバースして、「使用可能」の値として「真」を持つ変数を見つけることができます。

于 2013-01-23T05:42:32.047 に答える
0

すべての変数がグローバルスコープにある場合、私は以下が好きです

  var passedElements = [];
  for(var i = 1, l = 100 /* Maximum number of variable */ ; i < l; i++){
       if(window['example' + i]){
          var temp = window['example' + i];
          if(temp.available === true){
             passedElements.push(temp);
          }
       }/*
       else{
          // Dont break the loop here, if any variable is missing in between 
             two variables it will fail. Eg : Example1, Example3.. 2 is missing.
       }*/
  }
  console.log(passedElements);

お役に立てば幸いです。

于 2013-01-23T05:34:53.440 に答える