2015-04-04 2 views
1

В моем узле js program в маршрутах я создал массив с именем 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; 

Здесь, в модуле, я использую локальную переменную, как в этом классе проекта, я не использую какую-либо базу данных. Мои все модели извлекают значение из одной глобальной переменной.

Этот код работает нормально с первого запроса. Но при первом запросе изменение значения списка [i] .submitter локальное значение глобального изменения значения.

Изменение глобального значения создает проблему, когда я получаю второй запрос. При возврате второго запроса возврат из questionModel.getAllQuestions излишне обновляется.

ответ

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); 

Теперь, если вы меняете свойство вопросов внутри вопросовModelCopy, оно не будет изменять глобальную модель вопросов.

Refer SO

+0

Да, это проблема. Но какое решение? –

+0

Спасибо. Ваша глубокая функция работала –

+0

Рад помочь :) – mohamedrias

Смежные вопросы