[英]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.