1. ホーム
  2. javascript

[解決済み] 下敷きのデータが変わってもconstのデータが変わらないようにする方法

2022-02-07 08:29:33

質問

奇妙な問題に遭遇しています。私は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;

解決方法は?

JavaScriptでは、あるオブジェクトを別のオブジェクトに代入するとき、たとえばあなたのケースのように 参照コピー に代入されているため、両方の変数が 参照 は同じオブジェクトです。したがって、次のコードは次のような出力になります。

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

そこで fantastic4 を変更するようなものです。 tmnt というエラーが発生します。これは プリミティブ 文字列や数値のような

あなたの場合、これを回避するために Object.assign または spread operators .

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

これを試してみることをお勧めします。

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

これにより、同じデータを参照するのではなく、クローンを作成することになります。