У меня странная проблема. У меня есть функция, которая обновляет мои данные в серверной части Couchbase, и прежде чем я это сделаю, я запрашиваю, есть ли у нас запись или она будет новой. В моем коде я проверяю через if (docid[1].metrics.resultCount === 1), есть ли у нас запись или нет, а затем присваиваю результат const originalData через const originalData = docid[0][0].Record. Пока все хорошо, если я напечатаю на свою консоль данные в этот момент, данные верны. Но если я пойду и распечатаю его после некоторых изменений, внесенных в docid[0][0], он также, похоже, обновит originalData. Вопрос в том, как я могу хранить данные в const originalData, не подвергаясь изменениям в docid[0][0]?

 case '2':
              // Title Pro Farm Updates or Inserts

              // Get the Translation Template

              const templateId = "c90207b5-71d1-43d6-b644-f92cf415ecab"
              const mappings = await couch.getDoc('contacts', 'import_mapping::' + templateId)
              const data_map = mappings.result.value

              // Transform based on mappings
              let map_result = mapdata(data_map , json)
              // TODO: Remove Debug Print Out
              //console.log(JSON.stringify(map_result))

              
              myApn = json.APN
              // Strip Dashes from APN String
              myApn = myApn.replace(/-/g, "")
              // Get the DocId for the Doc which matches APN
              docid = await couch.n1qlQuery_wId('contacts', myN1qlStr, [myApn])
           

              if (docid[1].metrics.resultCount === 1) {
                const originalData = docid[0][0].Record
                console.log('Before Updates')
                console.log(originalData)

                DocId = docid[0][0].DocId
                console.log(' We are updating APN ' + myApn)
                // get update Object based on Import
                let update = await imp_help.farm_update_titlepro(map_result, res.locals.decoded.user_guid)

              
                // console.log(docid[0][0])

                // Mailing Address
                let MailingAddrObj = update.mailingAddress
                Object.keys(MailingAddrObj).forEach(key => MailingAddrObj[key] === undefined && delete MailingAddrObj[key])
                let MailingAddress = _.extend(docid[0][0].Record.mailingAddress, MailingAddrObj)

                // Owner Section
                let OwnerObj = update.Owners
                Object.keys(OwnerObj).forEach(key => OwnerObj[key] === undefined && delete OwnerObj[key])
                let Owner = _.extend(docid[0][0].Record.Owners, OwnerObj)

                // Sales Info
                let SalesInfoObj = update.SalesInfo
                Object.keys(SalesInfoObj).forEach(key => SalesInfoObj[key] === undefined && delete SalesInfoObj[key])
                let SalesInfo = _.extend(docid[0][0].Record.SalesInfo, SalesInfoObj)

             

                // Tax Info
                let TaxesObj = update.Taxes
                Object.keys(TaxesObj).forEach(key => TaxesObj[key] === undefined && delete TaxesObj[key])
                let Taxes = _.extend(docid[0][0].Record.Taxes, TaxesObj)

                // History
                let HistoryObj = update.History
                Object.keys(HistoryObj).forEach(key => HistoryObj[key] === undefined && delete HistoryObj[key])
                let History = _.extend(docid[0][0].Record.History, HistoryObj)


                // Farm Object
                let FarmObj = update
                Object.keys(FarmObj).forEach(key => FarmObj[key] === undefined && delete FarmObj[key])
                let Farm = _.extend(docid[0][0].Record, FarmObj)

                console.log('After Updates')
                console.log(originalData)

                Farm.mailingAddress = MailingAddress
                Farm.Owners = Owner
                Farm.emails = []
                Farm.phones = []
                Farm.SalesInfo = SalesInfo
                Farm.Taxes = Taxes
                Farm.History = History

                console.log(Farm)

                //let upsertResult = await couch.upsertDoc('contacts', DocId, Farm)
                // console.log(upsertResult)


              }
              else if (docid[1].metrics.resultCount == 0) {

                console.log("No Record Found")

                console.log(' We are creating New APN ' + myApn)
                // get update Object based on Import
                let newRecord = await imp_help.farm_create_titlepro(json, res.locals.decoded.user_guid)

                DocId = newRecord._type + "::" + newRecord._id
                console.log(DocId)
                let upsertResult = await couch.upsertDoc('contacts', DocId, newRecord)
                console.log(upsertResult)

              }
              break;
1
SamS87 17 Сен 2021 в 20:13

2 ответа

Лучший ответ

Это одна из самых известных неожиданностей в JavaScript. Вот почему многие люди не рекомендуют начинать изучать программирование с помощью JavaScript, а вместо этого начинают с языка более низкого уровня, такого как C ++.

В JavaScript, когда мы назначаем один объект другому, например, в вашем случае, у нас будет копирование по ссылке , потому что обе переменные присвоены ссылке на один и тот же объект. . Следовательно, следующий код приведет к следующему результату:

const ghostbusters = {number: 4};
const tmnt = {number: 4};
let fantastic4 = tmnt;

Copying by reference in JavaScript objects

Таким образом, изменение fantastic4 будет похоже на изменение tmnt, что приведет к этой ошибке. Это не относится к примитивам , таким как строки и числа.

В вашем случае, чтобы избежать этого, вы должны использовать Object.assign или spread operators.

const tmnt = {number: 4};
const fantastic4 = {...tmnt};

2 objects referencing 2 different data

Предлагаю вам попробовать следующее:

const originalData = {...docid[0][0].Record}
// or
const originalData = Object.assign({}, docid[0][0].Record)

Это создаст клон ваших данных вместо ссылки на тот же самый.

1
Ikdemm 17 Сен 2021 в 17:55

Вам следует использовать Object.assign, как показано ниже:

const originalData = Object.assign({}, docid[0][0].Record);

Он делает копию объекта

0
Naime 17 Сен 2021 в 17:40