JS:对象数组可以在For循环中访问,而不是在外面

时间:2017-09-18 05:01:55

标签: javascript arrays object undefined

我正在使用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);

1 个答案:

答案 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.extendjQuery.extend(true, {}, property)