シャローコピーとディープコピー
CoddyのJavaScriptジャーニー「論理とフロー」セクションの一部。レッスン 25/65。
object を copy するとき、copy には2種類あります:
- 浅い Copy - 第1階層のみを copy
- 深い Copy - すべての nested 階層を copy
浅いコピーの方法:
スプレッド演算子を使用する:
const original = { a: 1, b: { x: 2 } };
const spreadCopy = { ...original };ソースからターゲットの object へプロパティをコピーして新しい object を作成する Object.assign() の使用:
const assignCopy = Object.assign({}, original);浅いコピーの問題:
original.b.x = 3;
console.log(spreadCopy.b.x); // 3
// (ネストされたオブジェクトは参照を共有する)
console.log(assignCopy.b.x); // 3JSONメソッドとディープコピーを理解する
JSON.stringify()は、JavaScriptオブジェクトをJSON文字列に変換します。
const obj = { name: "John", age: 30 };
const jsonString = JSON.stringify(obj);
console.log(jsonString); // "{"name":"John","age":30}"JSON.parse() は JSON 文字列を JavaScript オブジェクトに戻します。
const backToObject = JSON.parse(jsonString);
console.log(backToObject); // { name: "John", age: 30 }JSONを使用したディープコピー:
const original = { a: 1, b: { x: 2 } };
const deepCopy = JSON.parse(JSON.stringify(original));
original.b.x = 3;
console.log(deepCopy.b.x); // 2(完全に独立)チャレンジ
簡単processCartという名前の関数を作成してください。この関数は、ショッピングカートを表すJSON stringを受け取ります。カートには、名前と価格を持つ商品の配列が含まれています。あなたの課題は次のとおりです。
- JSON stringをJavaScriptのobjectにParseする
- そこから別々の2つのカートをCreateする
- 2つ目のカートで、
- 各アイテムに
discountedプロパティを追加し、falseに設定する priceが50より大きいすべてのアイテムに10%の割引を適用する- 割引を受けたアイテムの'discounted'をtrueに設定する
- 各アイテムに
- 両方のカートを含む配列をreturnする
自分で試してみよう
function processCart(jsonString) {
// ここにコードを書いてください
}
// 関数の外には何も書かないでくださいこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
自分で練習してみよう: JavaScriptオンラインコンパイラ