在我的节点js程序中,我创建了名为list的数组。我已经从模型中声明的函数赋值给数组。路线代码是:
var express = require('express');
var router = express.Router();
var questionModel = require('../model/questionModel');
var userModel=require('../model/userModel');
/* GET home page. */
router.get('/', function(req, res, next) {
//declare an array and store the json data
var list=questionModel.getAllQuestions();
for(i=0;i<list.length; i++){
console.log(list[i].submitter);
console.log(userModel.getUserById(list[i].submitter)[0]);
list[i].submitter=userModel.getUserById(list[i].submitter)[0].fname;
}
console.log(list);
//respond with the array
res.json(list);
//res.redirect("../question/" + this_id);
});
module.exports = router;
这里的模块我在这个类项目中使用局部变量,我没有使用任何数据库。我的所有模型都从一个全局变量中获取值。
此代码在第一次请求时正常工作。但是在第一次请求时改变list [i]的值。发布者本地值的全局值变化。
当我收到第二个请求时,全局值的更改会产生问题。在第二个请求值上,来自questionModel.getAllQuestions的值不必要地更新。
答案 0 :(得分:2)
数组始终在javascript中通过引用传递。这就是编辑数组时它影响原始数组的原因。
在您的情况下,虽然您正在制作questionModel的副本,但您获得的仍然是数组中的对象列表。两个数组中的对象引用都将引用相同的对象。
因此,您对list[i].submitter
所做的更改也会影响原始对象。
如果您不希望更新发生,那么您需要深层复制数组中的对象,如下所示:
function deepCopy (arr) {
var out = [];
for (var i = 0, len = arr.length; i < len; i++) {
var item = arr[i];
var obj = {};
for (var k in item) {
obj[k] = item[k];
}
out.push(obj);
}
return out;
}
//测试用例
var questionsModelOriginal = [
{'a' : 1, submitter : "Rias"},
{'b' : 2, submitter : "SO"}
];
var questionsModelCopy = deepCopy(questionsModelOriginal);
现在,如果您更改questionsModelCopy中的问题属性,则不会修改全局问题模型。