数组覆盖(Javascript)

Array overwritten (Javascript)

本文关键字:Javascript 覆盖 数组      更新时间:2023-09-26

我正在做一个SPA,它可以让我们搜索电影标题和演员的名字(一个研究项目)。我被一个奇怪的问题卡住了。不幸的是,当我试图将2个表(场景和电影)连接成一个(所以我可以得到很多连接)创建的新数组总是被最后创建的对象覆盖。我找不到问题所在,如果有人能帮忙我会很高兴。问题在push方法和response .json(movie)之间。

var express = require('express');
var bodyParser = require('body-parser');
var port = +process.argv[2];
var app = express();
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
var movieID = 11; //first free movie's id
var scenaristID = 15; // first free scenarist's id
var scenarists = [ { id: 1, name: "Glenn Ficarra"},
              { id: 2, name: "John Requa"},
              { id: 3, name: "Jakub Kos"},
              { id: 4, name: "David Kos"},
              { id: 5, name: "Jonathan Nolan"},
              { id: 6, name: "Christopher Nolan"},
              { id: 7, name: "Jeb Stuart"},
              { id: 8, name: "Steven E. de Souza"},
              { id: 9, name: "Doug Richardson"},
              { id: 10, name: "Jason Hall"},
              { id: 11, name: "Noah Oppenheim"},
              { id: 12, name: "T.S Nowlin"},
              { id: 13, name: "Luc Besson"},
              { id: 14, name: "Michael Allin"}];
var movies = [ { id: 1, title: "Focus", scenarist1: 1, scenarist2: 2},
          { id: 2, title: "Test Drive", scenarist1: 3, scenarist2: 4},
          { id: 3, title: "Interstellar", scenarist1: 5, scenarist2: 6},
          { id: 4, title: "Die Hard", scenarist1: 7, scenarist2: 8},
          { id: 5, title: "Die Hard 2", scenarist1: 8, scenarist2: 9},
          { id: 6, title: "The Dark Knight Rises", scenarist1: 5, scenarist2: 6},
          { id: 7, title: "American Sniper", scenarist1: 10, scenarist2: -1},
          { id: 8, title: "The Maze Runner", scenarist1: 11, scenarist2: 12},
          { id: 9, title: "Taxi", scenarist1: 13, scenarist2: -1},
          { id: 10, title: "Enter The Dragon", scenarist1: 14, scenarist2: -1}];
movieCollection = new Array();
//GET - pobranie kolekcji
app.get('/movies', function (request, respond) {
    var i, scen1, scen2, scenarists, movie, movie2;
    console.log('reading movies');
    movie = { title: undefined,
             scenarist1: undefined,
             scenarist2: undefined,
             id: undefined
            };
    for (i = 0; i < movies.length; i++) {
        scen1 = movies[i].scenarist1;
        scen2 = movies[i].scenarist2;
        scenarists = connectScenarist(scen1, scen2);
        console.log('scenarists ' + i + ' = ' + scenarists.scenarist1 + ', ' + scenarists.scenarist2);
        movie.scenarist1 = scenarists.scenarist1;
        movie.scenarist2 = scenarists.scenarist2;
        movie.id = movies[i].id;
        movie.title = movies[i].title;
        movieCollection.push(movie);
        //console.log(movieCollection[i].scenarist1);
        //console.log(JSON.stringify(movieCollection));
    }
    //console.log(JSON.stringify(movieCollection));
    console.log(movieCollection[2].scenarist1);
    respond.json(movieCollection);
});
function connectScenarist(sce1, sce2) {
    var i, counter, allScenarists;
    counter = 0;
    allScenarists = {
        scenarist1: undefined,
        scenarist2: undefined
    };
    if (sce1 === -1) {
        allScenarists.scenarist1 = "-";
        counter++;
    }
    if (sce2 === -1) {
        allScenarists.scenarist2 = "-";
        counter++;
    }
    if (counter < 2) {
        for (i = 0; i < scenarists.length; i++) {
            if (sce1 === scenarists[i].id) {
                allScenarists.scenarist1 = scenarists[i].name;
                counter++;
            }
            if (sce2 === scenarists[i].id) {
                allScenarists.scenarist2 = scenarists[i].name;
                counter++;
            }
            if (counter === 2) {
                break;
            }
        }
    }
    //console.log('Saving movie: ' + JSON.stringify(allScenarists));
    return allScenarists;
}

是的,函数中只有一个movie对象。在JavaScript中,对象不会在赋值或调用时被复制。通过将文本放入循环体中,在每次迭代中创建一个新对象!

另外,在你的应用程序中有一个movieCollection数组,由所有请求共享。不完全是你想要的,得到其他用户的结果。

var movieCollection = [];
for (var i = 0; i < movies.length; i++) {
    var m = movies[i],
        scenarists = connectScenarist(m.scenarist1, m.scenarist2);
    movieCollection.push({
        title: m.title,
        scenarist1: scenarists.scenarist1,
        scenarist2: scenarists.scenarist2,
        id: m.id
    });
    console.log(movieCollection[i]);
}
console.log(JSON.stringify(movieCollection));

你可以试试jQuery的extend

试试这个:

var object = $.extend({}, object1, object2);