Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.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_Jquery_Arrays - Fatal编程技术网

将新创建的对象推送到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

当将新创建的对象推送到javascript数组中时,数组中的某些元素与最后一个元素相同,就好像最后一个推送的对象覆盖了旧对象中的某些部分一样。如下图所示

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
   ...