将新创建的对象推送到javascript数组会覆盖以前的部分数据
当将新创建的对象推送到javascript数组中时,数组中的某些元素与最后一个元素相同,就好像最后一个推送的对象覆盖了旧对象中的某些部分一样。如下图所示将新创建的对象推送到javascript数组会覆盖以前的部分数据,javascript,jquery,arrays,Javascript,Jquery,Arrays,当将新创建的对象推送到javascript数组中时,数组中的某些元素与最后一个元素相同,就好像最后一个推送的对象覆盖了旧对象中的某些部分一样。如下图所示 var urlRoot = "http://.../"; var allBooks = []; var i = 1; var max = 2; //3; getPage(i); function getPage(bookNo) { if (i > max) { return; } $.aj
var urlRoot = "http://.../";
var allBooks = [];
var i = 1;
var max = 2; //3;
getPage(i);
function getPage(bookNo) {
if (i > max) {
return;
}
$.ajax({
url: urlRoot + bookNo,
type: 'GET',
cache: false,
success: function(res) {
var html = res.responseText;
allBooks.push(new Book(html));
//allBooks[i - 1] = new Book(html);
console.log(allBooks);
i++;
getPage(i);
}
});
}
当仅推送两个元素和三个元素时,console.log(allBooks)给出以下结果(标签'EnglishbookHeading'的值更改;但数组'Pages'的内容与上次推送的内容相同):
Book.js: Page.js:
请参阅使用相同数组对象
thisPages
作为Book.Pages
属性值的问题,这样所有书籍将始终表示Pages
属性的相同值
您需要将Book
引用传递给setBook
方法,这样您就可以只向特定的书籍添加页面。比如说,
function Book(html) {
this.EnglishbookHeading = englishbookHeading;
this.Pages = [];
setBook(this, html);
};
function setBook(book, html) {
var con = $(html); //Context
...
var chapters = tumHadisler.find('div.chapter');
var index = 0;
chapters.each(function () {
var Page = new Page();
...
book.Pages[index] = Page;
index++;
});
}
function setBook(book, html) {
thisPages = []; // we are creating new array here that will be used for current book
var con = $(html); //Context
...
另一种选择是在setBook
方法中重置thisPages
,这也会起作用-例如
function Book(html) {
this.EnglishbookHeading = englishbookHeading;
this.Pages = [];
setBook(this, html);
};
function setBook(book, html) {
var con = $(html); //Context
...
var chapters = tumHadisler.find('div.chapter');
var index = 0;
chapters.each(function () {
var Page = new Page();
...
book.Pages[index] = Page;
index++;
});
}
function setBook(book, html) {
thisPages = []; // we are creating new array here that will be used for current book
var con = $(html); //Context
...
我不确定你的编码风格和编码组织,所以选择一个适合你的。你确定
stringify
不会把事情搞砸吗?console.log(allBooks)的输出是什么代码>?很好,我在console.log之后编辑了这个问题。@serefbilge,我怀疑是与书籍构造相关的代码。你能分享相关的代码吗?特别是在注入了页面
等属性的地方?@VinayC,我不认为,但我在问题中添加了Book.js和Page.js,以便进一步理解。@serefbilge,正如怀疑的那样,书籍创建是个问题-你正在关闭书籍构造函数中的相同页面对象。看看我的答案。我试过你的建议,同样的问题是:VarThisPages;函数书(html){thisPages=[];setBook(html);…@serefbilge,你能尝试第一种方法吗?在setBook
中传递图书引用?我不能100%确定闭包是否会绑定thisPages
引用或thisPages
的实际值-我怀疑它是前者,导致了问题。
function Book(html) {
this.EnglishbookHeading = englishbookHeading;
this.Pages = [];
setBook(this, html);
};
function setBook(book, html) {
var con = $(html); //Context
...
var chapters = tumHadisler.find('div.chapter');
var index = 0;
chapters.each(function () {
var Page = new Page();
...
book.Pages[index] = Page;
index++;
});
}
function setBook(book, html) {
thisPages = []; // we are creating new array here that will be used for current book
var con = $(html); //Context
...