数组覆盖(Javascript)
Array overwritten (Javascript)
我正在做一个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);
相关文章:
- 为什么用javascript覆盖2D数组的元素
- javascript覆盖tick显示值
- 是否可以在加载Disqus线程后使用javascript覆盖Disqus 2012中的css
- 通过 JavaScript 覆盖类
- Sonarqube不会从LCOV检索我的JavaScript覆盖范围
- 如何用Javascript覆盖CSS3动画
- 如何使用Javascript覆盖CSV
- 具有生成名称的 Javascript 覆盖函数
- Javascript覆盖超级函数
- Javascript 覆盖对象的方法
- 媒体查询的 Javascript 覆盖
- Javascript - 覆盖新的 Date() 行为以抵消 GMT
- Javascript:覆盖骨干模型的原型
- Javascript 覆盖相同的命名函数,尽管在 Chrome 中有条件
- Javascript 覆盖回调的范围
- 在 C# 中用 javascript 覆盖菜单 css
- Javascript覆盖函数
- Javascript覆盖,而所有内容都在后台加载
- Javascript 覆盖屏幕上的数据并刷新页面
- JavaScript 覆盖当前方法