[解決済み] 下敷きのデータが変わっても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)
これにより、同じデータを参照するのではなく、クローンを作成することになります。
関連
-
[解決済み】パッシブイベントリスナー内部でpreventDefaultができない
-
[解決済み】SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
[解決済み] JavaScriptで要素のクラスを変更するにはどうすればよいですか?
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み] jQueryを使用してハイパーリンクのhref属性を変更する方法
-
[解決済み] data-id属性を取得するにはどうすればよいですか?
-
[解決済み] node.jsのコンソールのフォントカラーを変更する方法は?
-
[解決済み] Node.jsのNPMモジュール(package.json)のdevDependenciesのインストールを防ぐにはどうすればよいですか?
-
[解決済み] Node.jsでPOSTデータを処理する方法は?
-
[解決済み] Node.jsの古いバージョンに変更する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Facebook Graph API のクエリで with=location を使用すると "Uncaught (in promise) undefined" というエラーが発生する。
-
[解決済み】SecurityError: オリジンを持つフレームがクロスオリジンフレームにアクセスするのをブロックした
-
[解決済み】jquery $.ajaxオブジェクトのresponseJSONプロパティを取得する方法 [重複]。
-
[解決済み】「Uncaught TypeError: Chromeで "Illegal invocation "が発生する。
-
[解決済み】BootstrapのCollapseが折りたたまれない
-
[解決済み】SyntaxError: 'import' と 'export' は 'sourceType: module' とだけ表示されるかもしれない - Gulp
-
[解決済み】JavaScript ランタイムエラー:'$'が未定義です。
-
[解決済み】DOMException: サポートされているソースが見つからなかったため、読み込みに失敗しました。
-
[解決済み】このオブジェクトの "forEach "はなぜ関数でないのですか?
-
[解決済み】Javascript、[オブジェクトHTMLInputElement]を表示中。]