[英]Array overwritten (Javascript)
我正在制作一個SPA,它將使我們可以搜索電影標題和舞台美術師的姓名(一個研究項目)。 好吧,我陷入了一個奇怪的問題。 不幸的是,當我嘗試將2個表(歌手和電影)連接成一個表(以便可以進行很多連接)時,創建的新數組始終被最后創建的對象覆蓋。 我找不到問題,如果有人可以幫助,我會很高興。 問題出在推送方法和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;
}
您可以嘗試jQuery的擴展
嘗試這個:
var object = $.extend({}, object1, object2);
是的,您的函數中只有一個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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.