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