javascriptの連想配列から指定のものを検索して上書きする方法
題名にあるのですが、連想配列の中から値を検索して、上書き(置き換える)というものなのですが、
現在の私のやり方ですととても作業が多く(エラーなども探りにくい)、使い回しも難しいので、質問させていただきました。
値を変更するのではなく、上書きしてしまいたいというのがあり、悩んでおります。
良い方法がありましたらご教授いただけたら幸いです。
下記のような連想配列があります。
var array = [ { id: "lists", value: [ [ { id: "no", value: 100, }, { id: "item", value: [ { id: "idA", value: "val A", }, { id: "idB", value: "val B", }, { id: "idC", value: [ { id: "nestID_C1", value: "val C1", }, { id: "nestID_C2", value: [ { id: "nestID_C2-1", value: "val nest c2-1" } ], }, ], }, { id: "idD", value: [ { id: "nestID_D1", value: "nest d-1", }, { id: "nestID_D2", value: [ [ { id: "nestID_D2-NO", value: "300" }, { id: "nestID_D2-1", value: "value nested d2 no-300 - 1" } ], [ { id: "nestID_D2-NO", value: "400" }, { id: "nestID_D2-1", value: "value nested d2 no-400 - 1" } ], ], }, ], }, ] } ], [ { id: "no", value: 200, }, { id: "item", value: [ { id: "idA", value: "val A", }, { id: "idB", value: "val B, }, { id: "idC", value: [ { id: "nestID_C1", value: "val nest c1", }, { id: "nestID_C2", value: [ { id: "nestID_C2-1", value: "val nested c2-1" } ], }, ], }, { id: "idD", value: [ { id: "nestID_D1", value: "nest d-1, }, { id: "nestID_D2", value: [ [ { id: "nestID_D2-NO", value: "300" }, { id: "nestID_D2-1", value: "value nested d2 no-300 - 1" } ], [ { id: "nestID_D2-NO", value: "400" }, { id: "nestID_D2-1", value: "value nested d2 no-400 - 1" } ], ], }, ], }, ] } ], ] } ];
この配列で、それぞれを置き換えたいです。
現在の私のやり方ですと、
// lists({id:"no", value: 200})/item/idC/nestID_C2/nestID_C2-1 // lists直下のNOは、状況に合わせてこちらで選択する。 // 上で記載した通り、今回は、lists下は200を取得する var oldArray = getArray(); // arrayの配列を取得 var lists = oldArray.find(el => el.id == "lists"); var itemIndex = -1; var targetNo = 200; // no200を探す for (let i=0; i<lists.value.length; i++) { const _item = lists.value[i].find(el => el.id == "no"); if (_item.value == targetNo) { itemIndex = i; break; } } // 存在しないときは終了 if (itemIndex == -1) { return; } // no 200の配列を取得 var list = lists.value[itemIndex]; // itemを取得 var item = list.find(el => el.id == "item"); // itemのvalueの中から、変更したいものを取り出す => 例:nestID_C2 -> nestID_C2-1のvalueを書き換える var idC = item.value.find(el => el.id == "idC"); var nestIDC2 = idC.value.find(el => el.id == "nestID_C2"); var nestIDC2_1 = nestIDC2.value.find(el => el.id == "nestID_C2-1"); // 書き換え nestIDC2_1.value = "new value"; // arrayの上書き処理 setArray(oldArray);
// no100の中にある、valueが400のnestID_D2-1を上書きしたい // lists({id:"no", value: 100})/item/idD/nestID_D2({id:"nestID_D2-NO", value: 400})/nestID_D2-1 // lists直下のNOと、nestID_D2下のNOは、状況に合わせてこちらで選択する。 // 上で記載した通り、今回は、lists下は100, nestID_D2下は400を取得する var oldArray = getArray(); // arrayの配列を取得 var lists = oldArray.find(el => el.id == "lists"); var itemIndex = -1; var targetNo = 100; // lists直下のno100を探す for (let i=0; i<lists.value.length; i++) { const _item = lists.value[i].find(el => el.id == "no"); if (_item.value == targetNo) { itemIndex = i; break; } } // 存在しないときは終了 if (itemIndex == -1) { return; } // no 100の配列を取得 var list = lists.value[itemIndex]; // itemを取得 var item = list.find(el => el.id == "item"); // itemのvalueの中から、変更したいものを取り出す var idD = item.value.find(el => el.id == "idD"); var nestIDC2 = idD.value.find(el => el.id == "nestID_D2"); // no400を探す var nestedTargetID = 400; var nestedItemIndex = -1; for (let i=0; i<nestIDC2.value.length; i++) { const _item = nestIDC2.value[i].find(el => el.id == "nestID_D2-NO"); if (_item.value == nestedTargetID) { nestedItemIndex = i; break; } } // 存在しないときは終了 if (nestedItemIndex == -1) { return; } var nestID_D2_1 = nestIDC2.value.find(el => el.id == "nestID_D2-1"); // 書き換え nestID_D2_1.value = "new value"; // arrayの上書き処理 setArray(oldArray);
getArray
やsetArray
の先はAPIになっており、そのままarray
を取得・上書きしてくれます。
上の例ですと、
idC
やnestID
など階層が深いものもあり、その都度バラバラなので違うケースのときにうまく対応できずそれぞれのケースを用意しているのが現状です。
技術不足ですいませんが、何卒よろしくお願い致します。
追加1
ご質問にありましたルールについて追記いたします。
基本的には、
{ id: xxxx, value: yyyy, }
が絶対の形となっており、これが1つのまとまりとなります。
これが、同じ階層に並ぶ場合には
{ id: xxxx, value: yyyy, }, { id: aaaaa, value: bbbb, }
と同階層に連なります。
ネストされる場合には必ず
{ id: xxxx, value: [ { id: aaaaa, value: bbbbb, }, ] }
のように、親のvalueの中に新たな要素ができます。
valueは配列を持つことができ、繰り返しネストすることができます。
{ id: xxxx, value: [ [ { id: aaaaa, value: bbbbb, }, { id: ccc, value: ddd, }, ], [ ....同様 ] ] }
と繰り返すことができます。
取得したい要素のidは、
lists(x)/item/idC/nestIDC1 x = { id: target_name, value: target_value }
のような形で情報を得ることはできます。
そのため、取得したいxが含まれている
listsの直下のidがx.id, valueがx.valueのが含まれる要素
などは、状況に応じて取得する工程は必要になります。
追記2
参考例を追加いたしました。
追加内容としましては、同一階層にあるものが1階層目にしかなく誤解がありそうでしたので参考配列を変更し、例を追加いたしました。
追記3
選択要素のxの仕様にもれがあったので、追記いたしました。
回答1件
あなたの回答
tips
プレビュー