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
何をどうしたいのかイマイチわかりません。
listItemは使っていないし、
CalcBillもAfterPaymentも、returnしてる割には、その値をどこにも代入してないし。
せめて、最終的に得たいオブジェクトを、ベタで構いませんので、掲示してください。
失礼しました。わかりやすくするために処理をいくつか消したのですが、それが残ってしまっていたようです。
やりたいこととしては、連想配列を使った場合の値渡しをしたいです。
init関数内で引数用のdataListを作成しております。
こちらの値をCalcBillに渡すと、AfterPayment関数内でみると
CalcBillでdataにて計算した値が残ってしまいます。
おそらく参照渡しになっているからだと思います。
連想配列を使わずに
list = [1,2,3]
のような配列は上記でも値が変わらないのですが、連想配列だと値が変わってしまいます。
なるほど。
おそらく、list[0].priceを出力しているからわかりずらいんだと思います。
list[1].priceの方は確かに、100と出るので、値が初期値ではありませんね
ちなみに、JavaScriptには、値渡しも参照渡しも存在しません。
変数は値に対する参照にしかすぎません。
回答に移った時、少しだけ説明入れさせていただきます。
回答5件
あなたの回答
tips
プレビュー