#javascript #object
Вопрос:
Таким образом, у меня есть объявленный объект переменной константы. т. е.:
const objData = {
project: {
name: '',
age: 0,
subProject: {
name: '',
age: 0
}
}
}
И функция, которая возвращает objData:
const dataSchema = () => {
return objData;
}
Поток состоит в том, что я хочу вставить данные в свою таблицу/коллекцию в свою базу данных. Поэтому я использую константы для объявления схемы, а затем просто вставляю возвращенную схему данных.
Это моя функция, чтобы установить значение в dataSchema:
const mappingData1 = (data) => {
try {
const dataScheme = Object.assign({}, dataSchema())
dataScheme.project.name = data.name;
dataScheme.project.age = data.age;
return dataScheme;
}catch(err){
return err; //return wrapper error here
}
}
const mappingData2 = (data) => {
try {
const dataScheme = Object.assign({}, dataSchema())
dataScheme.project.subProject.name = data.name;
dataScheme.project.subProject.age = data.age;
return dataScheme;
}catch(err){
return err; //return wrapper error here
}
}
Вызовите функцию схемы mappingData и вставьте данные в БД:
//this bellow statement will be called in insertProjectData func, and called in the first time
const data = { name: 'Someone', age: 7 }
const mappedData = await mappingData1(data)
const result = await this.command.insertData(mappedData)
===================================================================================
//this bellow statement will be called in insertSubProjectData func, and called after insertProjectData func
const data = { name: 'Someone', age: 7 }
const mappedData = await mappingData2(data)
const result = await this.command.insertData(mappedData)
Проблема в том, что когда служба запущена и функция insertSubProjectData вызывается после функции insertProjectData, почему project.name и project.age тоже устанавливается со значением функции insertProjectData? даже несмотря на то, что я не установил project.name и project.age в insertSubProjectData? Похоже, что исходные данные (objData) были изменены. Я уже использую Object.assign тоже, чтобы создать новый объект
Есть какие-нибудь идеи, пожалуйста? Спасибо!
Ответ №1:
Вы можете гарантировать новый объект, изменив свою реализацию с этого:
const objData = {
project: {
name: '',
age: 0,
subProject: {
name: '',
age: 0
}
}
}
// And the function that returns the objData:
const dataSchema = () => {
return objData;
}
К этому:
const dataSchema = () => ({
project: {
name: '',
age: 0,
subProject: {
name: '',
age: 0
}
}
})
Тогда каждый раз у вас будет настоящий новый Объект. Больше никаких проблем
Комментарии:
1. Спасибо, что это сработало, поэтому вывод таков: когда функция возвращает переменную, она все равно изменяет саму возвращаемую переменную?
2. @masdap в нем есть ссылка на objData. Таким образом, он возвращает ту же ссылку в функции