2017-09-18 2 views
0

JS、jQuery、AJAXなどを使用して、最初からモノポリーゲームを作成しています。JS:Forループでアクセス可能なオブジェクト配列

不満な問題があります。 Iは、プロパティオブジェクトを定義して、そして(関数の外側の両方)プロパティライブラリ配列....

var propLib = new Array(); 

var property = { 
    position: 0, 
    name: "", 
    price: 0, 
    rent: 0, 
    ppHouse:0, 
    mortage: 0, 
    owner: "", 
    priceWithHouse:[0,0,0,0,0], 
}; 

次に、私は他のアレイからの情報を用いてアレイを移入:

function popArray(){ 

       //Populate Property Library with Names off Board 
       for(var i=0;i <= strPropNames.length;i++){ 
        propLib.push(property); 
        propLib[i].position = i; 
        propLib[i].name = strPropNames[i]; 
        propLib[i].price = intPropPrice[i]; 
        propLib[i].mortage = (intPropPrice[i]/2); 

        alert(propLib[i].name + "Pos: "+ propLib[i].position+" "+propLib[i].price) 
       } 


    } 

注意:その警告はうまくいきます。このforループの外にある定数または別の変数を使って同じ警告を試みるとすぐに、それは未定義として返します。

これまでのところ、 "var"という接頭辞を付けずに変数を宣言しようとしましたが、それはもっとグローバルであり、無駄になります。助言insert_name_here何という

回答:

私は、各ループの繰り返し同じオブジェクトを書き換えた、答えはそうのように見えるので...その私ができるいくつかの問題が

var newObject = jQuery.extend(true, {}, property); 

       propLib.push(newObject); 
+0

あなたもstrPropNamesのデータを投稿することができますが?それには値がなく、strPropNames.lengthが0を返すことがあります。 – Lalit

+0

@Roman what is strPropNames –

+0

これはボード上のプロパティ名の配列です。私が言ったように、forループの各繰り返しの最後にアラートが働くので、文字列が割り当てられます。 –

答えて

0

ありますここを参照してください。

まず、forループの条件、i <= strPropNames.lengthが間違っています。それはi < strPropNames.lengthでなければなりません。そうしないと、繰り返し回数が多くなります。

第2に、同じオブジェクト(property)を複製することなく、その都度プッシュしています。

JavaScriptでは、オブジェクトを保持する変数は、実際にはそのオブジェクトへの参照を保持しているだけです。この変数の複数のコピーを配列にプッシュすると、オブジェクトはコピーされません。参照をコピーするだけです。つまり、配列のどの要素を変更していても、同じオブジェクトを変更しているということです。

propLibのすべての要素が同じオブジェクトを参照しているため、特定のプロパティを変更する必要があるたびに、実際に同じプロパティを変更しています。 alertは各ループの最後に実行されるため、正常に動作しているように見えますが、実際にはalertのデータは次の繰り返しで上書きされます。

ここで修正されたバージョンです:

function popArray(){ 

       //Populate Property Library with Names off Board 
       for(var i=0;i < strPropNames.length;i++){ 
        propLib.push({ 
         position: 0, 
         name: "", 
         price: 0, 
         rent: 0, 
         ppHouse:0, 
         mortage: 0, 
         owner: "", 
         priceWithHouse:[0,0,0,0,0], 
        }); 
        propLib[i].position = i; 
        propLib[i].name = strPropNames[i]; 
        propLib[i].price = intPropPrice[i]; 
        propLib[i].mortage = (intPropPrice[i]/2); 

        alert(propLib[i].name + "Pos: "+ propLib[i].position+" "+propLib[i].price) 
       } 


    } 

また、あなたはあなたのpropertyテンプレートを維持し、(例えばjQuery.extendで:jQuery.extend(true, {}, property))各反復でそれを複製することができ

+0

はい、< でもプロパティを複製する限り、説明できますか? –

+0

あなたのクローンニングのおかげで、私はこのようになってしまいました。 var newObject = jQuery。extend(真、{}、プロパティ)。 \t \t \t \t \t \t \t \t propLib.push(でnewObject)。 –

+0

@RomanElizen私はより完全な説明で私の答えを編集しました。 –

関連する問題