为什么我不能在javascript中将相同的元素插入到数组中?

时间:2011-11-21 13:08:11

标签: javascript

我有一个对象数组。但是当我插入我之前添加的对象时,它将覆盖我之前的对象。我怎么解决呢?

我有一个叫做玩家的对象。在播放器中,我有两个数组:一个名为onHandWeapon,一个名为onFieldWeapon。它们是武器对象的阵列。

function player(lp){
        this.lp = lp;
        this.onFieldWeapon = new Array();
        this.onHandWeapon = new Array();

    } 

function weapon(id, heart, bullet, src){
            this.id = id;
            this.heart = heart;
            this.bullet = bullet;
            this.src = src;
            this.location;
            this.name;
            this.discription;
            this.bufferBullet = bullet;
    }

我在onHandWeapon数组中设置了三个虚拟对象。然后我想随机拿起其中一个并将其放入onFieldWeapon并为其分配一个随机位置。

 function aiCreateWeapon(){
        var b = Math.floor(Math.random()*ai.onHandWeapon.length);
        $('#console').append(' ' + b + ' ');
        var ip = 100;

        while($('#'+ip).attr('class') != 'enemyField'){
            ip = Math.floor(Math.random()*48);
        }

        encurrentWeapon = ai.onHandWeapon[b];

        var source = encurrentWeapon.src;

        var oImg = document.createElement("img");
        oImg.setAttribute('src', source);
        oImg.setAttribute('height', '60px');
        oImg.setAttribute('width', '60px');
        $('#'+ip).append(oImg).show('explode','slow');

        encurrentWeapon.location = ip;  
        ai.onFieldWeapon.push( encurrentWeapon);

        $('#console').append(' ' + ai.onFieldWeapon[0].location + ' ');
}

aiCreateWeapon是一个函数绑定到按钮。单击它时,ai.onFieldWeapon [0] .location是一个固定的位置,直到它发生变化。我已经检查过每次将与第一个元素相同的对象添加到onFieldWeapon数组时,它将覆盖第一个元素的数据。

1 个答案:

答案 0 :(得分:1)

当您将同一个对象多次插入到数组中时,您将在数组中有多个条目,这些条目都是对同一底层对象的引用。在以下示例中,myArrayx以及ymyObj变量中的所有三个条目都指向相同的基础对象,因此如果更改对象的属性通过其中一个数组项不是它也更新了其他数组项,而是其他数组项指向您刚刚更改的同一个对象:

var myObj = { "p1" : "v1", "p2" : "v2" };
var myArray = [];
// all of the following reference the same underlying object as myObj,
// not copies of myObj.
myArray.push(myObj);
myArray.push(myObj);
myArray.push(myObj);
var x = myObj,
    y = myObj;
myArray[1].p1 = "new value";
alert(myArray[0].p1); // "new value"
alert(x.p1); // "new value"

听起来你想要做的就是每次都创建一个 copy 对象,这样数组中的每个项目都是一个独立的对象,你可以在不影响所有其他对象的情况下进行更新。不幸的是,在JavaScript中没有内置的方法可以做到这一点。幸运的是,编写自己的对象复制函数并不是特别困难,尤其是在您似乎只有一维对象的情况下:

function copyObject(srcObj) {
   // create new blank object and copy the direct properties one by one
   var newObj = {};
   for (var k in srcObj)
      if (srcObj.hasOwnProperty(k))
          newObj[k] = srcObj[k];
   return newObj;
}

var myObj = { "p1" : "v1", "p2" : "v2" };
var myArray = [];
// make independent copies instead of just more references to the same object
myArray.push(copyObject(myObj));
myArray.push(copyObject(myObj));
myArray.push(copyObject(myObj));
var x = copyObject(myObj),
    y = copyObject(myObj);
myArray[1].p1 = "new value";
alert(myArray[0].p1); // "v1"

如果你有包含对象或数组的对象,那么你的copyObject()函数需要更复杂 - 通常会使用某种形式的递归。