簡體   English   中英

javascript數組填充異常

[英]javascript array filled strangely

我正在用角度編寫一個應用程序,並創建了一個名為Workbooks的自定義服務數組,每個自定義服務都有一個名為Views的自定義服務數組。 我用一個簡單的for循環填充數組,但是由於某些原因,這會產生意外的結果:

第一次迭代后,數組中有一個工作簿: Workbook 1

在第二個之后,有兩個名為工作 Workbook 2 Workbook 2 簿Workbook 2 Workbook 2

第三之后: Workbook 3 Workbook 3 Workbook 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;

怎么會這樣 第一個工作簿被分配一個標題,然后分配給數組中的第一個點。 i為2時,如何將名為Workbook 3的工作Workbook 3分配給數組中的第0和第1點以及第2點?

作為參考,以下是該應用程序相關代碼的小插曲 謝謝!

您沒有將ith工作簿分配給數組中的每個位置,而是將SAME工作簿分配給了每個工作簿,然后更新了標題。 你需要做

var workbook = Workbook;

進入這個

var workbook = new Workbook;

好,第一個問題:

for (var i = 0; i < 3; i++) {
var workbook = Workbook;
workbook.setTitle("workbook " + (i + 1));

每次通過此循環,您都將重新創建變量“工作簿”,並將其命名為“工作簿X”。

但是看起來您並不是每次都在創建NEW工作簿,而是您在重復使用相同的引用,因此每個工作簿最終都只是對同一對象的引用。

下次當您遍歷循環時,您只是在重新分配該引用的標題,並且兩者都在更新。

試試這個,看看它如何響應。

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;

在工廠的實現中,您需要在每次工廠調用時返回新對象。

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();

請看一下。 普倫克

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM