JavaScriptの勉強をしており、参照渡しと値渡しの部分でハマっております。
C++ならポインタを使えば改善できる問題なのですが、
この処理をJavaScriptで書く方法がよく理解できておりません。
関数を2つ用意して、連想配列を代入する処理を記載しております。
用意した関数内で
let data = list; // listは引数で指定した連想配列
のように連想配列を代入してしまうと、dataの中身を
変更することで引数のlistの値が変わってしまいます。
他のサイトを見るとJSONで渡したり、ディープコピーをすれば
改善できると記載があったのですが、どちらの方法でも値が変わってしまうようでした。
こういった場合、JavaScriptではどのように処理を書くのが正しいのでしょうか。
JavaScript
1const listMember = [ 2 { title: '1' }, 3 { title: '2' }, 4 { title: '3' }, 5]; 6 7const listItem = [ 8 9 { 10 title: '1', 11 price: 300, 12 paidId: '1', 13 paidMember: ['1', '2', '3'], 14 }, 15 16 { 17 title: '2', 18 price: 200, 19 paidId: '1', 20 paidMember: ['1', '2'], 21 }, 22 23]; 24 25// メンバーごとにlistを計算用の作る 26function InitList(listMember){ 27 28 let list = []; 29 30 // 計算用の配列に人物名と価格を初期化して格納 31 for (let i = 0; i < listMember.length; i++) { 32 let item = [ 33 { 34 title: '', 35 price: 0, 36 } 37 ] 38 item.title = listMember[i].title; 39 item.price = 0; 40 list.push(item); 41 } 42 43 return list; 44 45} 46 47// 割り勘後の徴収金額 48function CalcBill(list, listItem){ 49 50 //console.log(list.length); 51 52 //let data = list; 53 //let data = list.concat(); 54 //let data = JSON.stringify(list); 55 //data = JSON.parse(data); 56 let data = Object.create(list); 57 console.log('price',data[0].price); 58 59 // メンバーごとに合計価格を計算 60 for (let i = 0; i < data.length; i++) { 61 data[i].price = i*100; 62 } 63 64 return data; 65 66} 67 68function AfterPayment(list, listItem){ 69 70 //let data = list; 71 //let data = list.concat(); 72 let data = Object.create(list); 73 console.log('price',data[0].price); // ここの値が0ではなくCalcBillで計算した値になる 74 75 return data; 76 77} 78 79init() { 80 let dataList = InitList(listMember); 81 CalcBill(dataList, listItem); 82 //dataList = InitList(listMember); // コメントを消すと0にできる 83 AfterPayment(dataList, listItem); 84} 85
回答5件
あなたの回答
tips
プレビュー