Как не изменять происхождение объекта в javascript во время работы службы

#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. Таким образом, он возвращает ту же ссылку в функции