2015-05-07 45 views
0

我有一個函數,我通過2個數組循環,並做一些邏輯。我的問題是,當我改變數組中的一個對象屬性時,他們也改變了我的基礎對象變量和整個兩個數組中的所有其他對象。即使我只想編輯特定的對象屬性。我不想粘貼整個代碼,所以我會告訴你我的重要功能,但也留下一個鏈接到我的整個代碼。其他變量沒有理由 - javascript

var updateMobs = function() { 

    for (var b = 0; b < mobsBlue.length; b++) { 
     BM = mobsBlue[b]; 
     BM.x = BM.x - BM.object.speed; 

     doCollision(BM, redBase, BM); 
     doCollision(BM, debugPlayer, BM); 

     if (BM.x < 0){ 
      mobsBlue.splice(b, 1); 
     }; 

     BM.Draw(ctx, false, true, "blue") 


    }; 
    for (var r = 0; r < mobsRed.length; r++) { 
     RM = mobsRed[r]; 
     RM.x = RM.x + RM.object.speed; 

     doCollision(RM, blueBase, RM); 
     doCollision(RM, debugPlayer, RM); 

     if (RM.x > ctx.canvas.width){ 
      mobsRed.splice(r, 1); 
     }; 

     RM.Draw(ctx, false, true, "red")  

     for (var br = 0; br < mobsBlue.length; br++) { 
      BM = mobsBlue[br]; 

      if (doCollision(RM, BM, collisionNull) == true) { // ATTACKING 
       BM.x = BM.x + BM.object.speed; 
       RM.x = RM.x - RM.object.speed; 

       if (BM.object.attackTime == BM.object.attackSpeed || RM.object.attackTime == RM.object.attackSpeed) { 
        if (BM.object.armourType == 'light') { 
         BM.object.health = BM.object.health - RM.object.lightDamage; 
        }; 
        if (BM.object.armourType == 'heavy') { 
         BM.object.health = BM.object.health - RM.object.heavyDamage; 
        }; 
        if (RM.object.armourType == 'light') { 
         RM.object.health = RM.object.health - BM.object.lightDamage; 
        }; 
        if (RM.object.armourType == 'heavy') { 
         RM.object.health = RM.object.health - BM.object.heavyDamage; 

        }; 
        alert("BLUE" + BM.object.health) 
        alert("RED" + RM.object.health) 
        if (BM.object.health <= 0) { 
         mobsBlue.splice(br, 1); 
        }; 
        if (RM.object.health <= 0) { 
         mobsRed.splice(r, 1); 
        }; 
        BM.object.attackTime = 0; 
        RM.object.attackTime = 0; 

       }; 
       BM.object.attackTime = BM.object.attackTime + 1; 
       RM.object.attackTime = RM.object.attackTime + 1; 

      };       
      BM.Draw(ctx, false, true, "blue"); 
      RM.Draw(ctx, false, true, "red"); 
     }; 
    }; 
}; 

http://pastebin.com/TPZE3Uqu

+0

'我的問題是,當我在數組中改變一些對象的屬性,他們也改變我的基礎對象變量和整個兩個數組中的所有其他對象 - 你能具體嗎? – thefourtheye

+0

閱讀編輯,用'one'替換'some' – user4876138

回答

0

這樣做:

function clone(obj) { 
    if (null == obj || "object" != typeof obj) return obj; 
    var copy = obj.constructor(); 
    for (var attr in obj) { 
     if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; 
    } 
    return copy; 
} 

OR 在ECMAScript中6有是Object.assign方法,它將所有可枚舉自身屬性的值從一個對象複製到另一個對象。

例如:

var x = {myProp: "value"}; 
var y = Object.assign({}, x); //shallow copy 

或jQuery的

var newObject = jQuery.extend({}, oldObject); // Shallow copy 

var newObject = jQuery.extend(true, {}, oldObject); //深複製

+1

我的印象是Object.assign更像是'jQuery.extend({},oldObject)'(即不是深度合併) – DRobinson

+0

絕對正確。更新了答案 –

+0

謝謝:)非常感謝 – user4876138

相關問題