javascriptの連想配列の中の子要素を、別の子要素形式の配列で上書きしたいですが、うまくできなくて困っています。
javascript gridライブラリでセルの編集を使用しています。
不明点はjavascriptの配列の処理方法なので、gridのことは省略します。
■元データ(rowVersion列を追加)
javascript
1let currentRowData = [ 2 { 3 id: 1, name: "A", values: [ 4 { id: 1, parentId: 1, name: "a", value: 1 , rowVersion: "xxx" } 5 ] 6 } 7];
■ gridのセルをダブルクリックすると、childrenの入力を子画面で行います。
画面イメージ(ヘッダ追加)
name value
a □
b □
c □
[選択]
■ [選択]ボタンを押したとき、下記のscriptのような動きを想定していますが、うまくいかなく、どのように処理すれば良いでしょうか?
ただし、子画面で全てが入力しているとは限らないし、入力を消したものがnullになる場合もある。childrenのidが発行済みの場合もある。
※parentのidが0の時もありますが、それは質問の内容から省略します。
問題の原因はidがないものがあるのにfindを使っているので、もしかしたら
nameとvalue !== nullの2つの条件で取得しないといけないかもしれません。
javascript
1// 例①のデータを変更、parentのidが1の時とした場合 2let id = 1; 3 4// 元データ(rowVersion列を追加) 5let rowData = [ 6 { 7 id: 1, name: "A", values: [ 8 { id: 1, parentId: 1, name: "a", value: 1, rowVersion: "xxx"} 9 ] 10 } 11]; 12 13// 子画面で入力した変更データ(この入力データにrowVersion列はありません。) 14let values = [ 15 { id: 1, parentId: 1, name: "a", value: 1 }, 16 { id: 0, parentId: 1, name: "b", value: 4 }, 17 { id: 0, parentId: 1, name: "c", value: null } // これは入力していないデータ 18]; 19 20// childenのデータを更新 21const newRowData = rowData.map((currentValue) => { 22 // 例ではこのif文はid=1でtrueになります 23 if (currentValue.id === id) { 24 25 // valuesを、元データに上書きしたい 26 let childrens = values.map((currentValue2) => { 27 // 問題の原因はidがないからかも? 28 const newValue = currentRowData.values.find(({ id }) => currentValue2.id === id); 29 return newValue ?? currentValue2; 30 }, []); 31 32 currentValue2.values = childrens; 33 } 34 35 return currentValue; 36});
仕様追加しました。
・parentのidと、childrensのchildrenのparentIdは紐づいてます。
・childrensのidとrowVersion列は元のデータを利用、新しく入力したchildrensのchildrenで1つずつ入力箇所のみ、上書きしなければならない
(追記)
以下のようなコードを考えてみました。間違っている個所があるかもしれませんが。
少し冗長になってしまったかもしれません。
javascript
1let id = 1; 2 3let rowData = [ 4 { 5 id: 1, name: "A", values: [ 6 { id: 1, parentId: 1, name: "a", value: 1, rowVersion: "xxx"} 7 ] 8 } 9]; 10 11let values = [ 12 { id: 1, parentId: 1, name: "a", value: 1 }, 13 { id: 0, parentId: 1, name: "b", value: 4 }, 14 { id: 0, parentId: 1, name: "c", value: null } // これは入力していないデータ 15]; 16 17// childensのchildenでデータを更新 18const newRowData = rowData.map((currentValue) => { 19 // 例ではこのif文はid=1でtrueになります 20 if (currentValue.id === id) { 21 22 // valuesを、元データに上書きしたい 23 let childrens = values.map((currentValue2) => { 24 // find 25 let findChildren = currentValue.values.find((element) => { 26 return element.id === currentValue2.id && element.name === currentValue2.name; 27 }); 28 29 // newChildrenを準備、 findChildrenがあれば差し替え 30 let newChildren = { id: 0, parentId: id, name: null, value: null, rowVersion: null }; 31 findChildren ? (newChildren = findChildren) : null; 32 33 // newChildrenを更新 34 newChildren.name = currentValue2.name; 35 newChildren.value = currentValue2.value; 36 37 return newChildren; 38 }, []); 39 40 currentValue.values = childrens; 41 } 42 43 return currentValue; 44}, []);
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。