Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript数组填充得很奇怪_Javascript_Arrays_Debugging_Angularjs - Fatal编程技术网

javascript数组填充得很奇怪

javascript数组填充得很奇怪,javascript,arrays,debugging,angularjs,Javascript,Arrays,Debugging,Angularjs,我正在angular中编写一个应用程序,并创建一个名为Workbook的自定义服务数组,每个自定义服务都有一个名为Views的自定义服务数组。我用一个简单的for循环填充数组,但出于某种原因,这会产生意想不到的结果: 第一次迭代后,数组中有一个工作簿: 工作簿1 在第二本之后,有两本工作手册标题为工作簿2:工作簿2工作簿2 第三个之后:工作簿3工作簿3工作簿3 等等。这怎么会发生?以下是创建工作簿并将其添加到数组的代码的简化版本: for (var i = 0; i < 3; i++) {

我正在angular中编写一个应用程序,并创建一个名为Workbook的自定义服务数组,每个自定义服务都有一个名为Views的自定义服务数组。我用一个简单的for循环填充数组,但出于某种原因,这会产生意想不到的结果:

第一次迭代后,数组中有一个工作簿:
工作簿1

在第二本之后,有两本工作手册标题为工作簿2
工作簿2
工作簿2

第三个之后:
工作簿3
工作簿3
工作簿3

等等。这怎么会发生?以下是创建工作簿并将其添加到数组的代码的简化版本:

for (var i = 0; i < 3; i++) {
    var workbook = Workbook;
    workbook.setTitle("workbook " + (i + 1));
    for (var j = 0; j <2; j++ ) {
        var view = View;
        view.setTitle("view " + (j + 1));
        workbook.addView(view);
    }

    workbooks[i] = workbook;

    //this next for loop can be used to print the array as described    
    for (var k = 0; k < workbooks.length; k++) {
        console.log(workbooks[k].getTitle());
    }
}

return workbooks;
for(变量i=0;i<3;i++){
var工作簿=工作簿;
工作簿.setTitle(“工作簿”+(i+1));
对于(var j=0;j井,第一个问题:

for (var i = 0; i < 3; i++) {
var workbook = Workbook;
workbook.setTitle("workbook " + (i + 1));
for(变量i=0;i<3;i++){
var工作簿=工作簿;
工作簿.setTitle(“工作簿”+(i+1));
每次通过此循环,您都会重新创建变量“工作簿”,并将其命名为“工作簿X”

但看起来您并不是每次都创建一个新工作簿,而是重复使用相同的引用,因此每个工作簿最终都只是对同一对象的引用

下一次遍历循环时,您只需重新指定此引用的标题,并且它们都在更新

试试这个,看看它的反应如何

var workbook; // Just cleaner, avoids re-declaring the variable
for (var i = 0; i < 3; i++) {
    workbook = new Workbook; // avoids re-referencing the same Workbook
    workbook.setTitle("workbook " + (i + 1));
    for (var j = 0; j <2; j++ ) {
        var view = View;
        view.setTitle("view " + (j + 1));
        workbook.addView(view);
    }

    workbooks[i] = workbook;

    //this next for loop can be used to print the array as described    
    for (var k = 0; k < workbooks.length; k++) {
        console.log(workbooks[k].getTitle());
    }
}

return workbooks;
var工作簿;//只需清理,即可避免重新声明变量
对于(变量i=0;i<3;i++){
工作簿=新工作簿;//避免重新引用同一工作簿
工作簿.setTitle(“工作簿”+(i+1));
对于(var j=0;j井,第一个问题:

for (var i = 0; i < 3; i++) {
var workbook = Workbook;
workbook.setTitle("workbook " + (i + 1));
for(变量i=0;i<3;i++){
var工作簿=工作簿;
工作簿.setTitle(“工作簿”+(i+1));
每次通过此循环,您都会重新创建变量“工作簿”,并将其命名为“工作簿X”

但看起来您并不是每次都创建一个新工作簿,而是重复使用相同的引用,因此每个工作簿最终都只是对同一对象的引用

下一次遍历循环时,您只需重新指定此引用的标题,并且它们都在更新

试试这个,看看它的反应如何

var workbook; // Just cleaner, avoids re-declaring the variable
for (var i = 0; i < 3; i++) {
    workbook = new Workbook; // avoids re-referencing the same Workbook
    workbook.setTitle("workbook " + (i + 1));
    for (var j = 0; j <2; j++ ) {
        var view = View;
        view.setTitle("view " + (j + 1));
        workbook.addView(view);
    }

    workbooks[i] = workbook;

    //this next for loop can be used to print the array as described    
    for (var k = 0; k < workbooks.length; k++) {
        console.log(workbooks[k].getTitle());
    }
}

return workbooks;
var工作簿;//只需清理,即可避免重新声明变量
对于(变量i=0;i<3;i++){
工作簿=新工作簿;//避免重新引用同一工作簿
工作簿.setTitle(“工作簿”+(i+1));

对于(var j=0;j您不是将第i个工作簿分配给数组中的每个点,而是将相同的工作簿分配给每个点,然后更新标题。您需要

var workbook = Workbook;
进入这个

var workbook = new Workbook;

您不是将第i个工作簿分配给数组中的每个点,而是将相同的工作簿分配给每个点,然后更新标题。您需要

var workbook = Workbook;
进入这个

var workbook = new Workbook;

在工厂实现中,每次工厂调用都需要返回新对象

GATapp.factory('Workbook', function () { 
    return function () {
        var title;
        var views = [];
        this.getTitle = function () {
            return title;
        }
        this.setTitle = function (newTitle) {
            title = newTitle;
        }
        this.getViews = function () {
            return views;
        }
        this.addView = function (newView) {
            views.push(newView);
        }
        this.getView = function (i) {
            return views[i].getTitle();
        }
    };
});
并在使用工厂时创建新对象

var workbook = new Workbook();

请看一看。

在factory的实现中,每个factory调用都需要返回新对象

GATapp.factory('Workbook', function () { 
    return function () {
        var title;
        var views = [];
        this.getTitle = function () {
            return title;
        }
        this.setTitle = function (newTitle) {
            title = newTitle;
        }
        this.getViews = function () {
            return views;
        }
        this.addView = function (newView) {
            views.push(newView);
        }
        this.getView = function (i) {
            return views[i].getTitle();
        }
    };
});
并在使用工厂时创建新对象

var workbook = new Workbook();

请看一看。

它们都是相同的对象,可能您在
var workbook=workbook;
?处缺少了一个
new
,或者缺少了一个
对象。创建(工作簿)
如果
工作簿
是一个看起来像它的对象。它们都是同一个对象,可能您在
var Workbook=Workbook;
?处缺少一个
新的
,或者缺少一个
对象。创建(工作簿)
如果
工作簿
是一个看起来像它的对象。哦,你是对的,我需要在我的工厂返回一个对象。谢谢你的帮助!哦,你是对的,我需要在我的工厂返回一个对象。谢谢你的帮助!谢谢你对我的代码的帮助!我没有意识到我一直在引用同一个对象t、 :)没问题……javascript在某些地方有点奇怪。它是一种非常灵活和强大的语言,但不要让语法蒙蔽了你;有很多地方javascript在思想和行为上都不像标准的C风格语言。我可能会强烈推荐《javascript:好的部分》一书…这有助于您理解JavaScript对对象的“思考”方式。谢谢,我来看看!我一直在努力寻找一本好书来了解JavaScript的全貌。感谢您对我的代码的帮助!我没有意识到我一直在引用同一个对象。:)这不是问题……javascript在某些地方有点奇怪。它是一种非常灵活和强大的语言,但不要让语法蒙蔽了你;有很多地方javascript并不认为或表现得像标准的C风格语言。我可能强烈推荐《javascript:好的部分》一书…这有助于您理解JavaScript对对象的“思考”方式。谢谢,我来看看!我一直在努力寻找一本好书,以了解JavaScript的全貌。