我正在使用JS,jQuery和AJAX等从零开始制作大富翁游戏。
遇到令人沮丧的问题。 我已经定义了一个属性对象和一个属性库数组(两者都在函数之外)....
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循环之外的常量或其他变量尝试相同的警报,它就会返回为undefined。
到目前为止,我已经尝试声明没有“var”前缀的变量,因为我读到的可能更“全局”,但无济于事。
回答是insert_name_here的建议:
我在每个循环迭代中重写相同的对象,所以答案看起来就是这样......
var newObject = jQuery.extend(true, {}, property);
propLib.push(newObject);
答案 0 :(得分:0)
我可以在这里看到一些问题。
首先,for
循环的条件i <= strPropNames.length
是错误的。它应该是i < strPropNames.length
,否则它会迭代一次太多次。
其次,每次都要推送同一个对象(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)
)