###実現したいこと
オブジェクトを抽出するとき、親階層と子階層を、同じ関数get_extractObj
で抽出したいです。
###対象のオブジェクト
ご覧のように親階層にも子階層にも"post_type":"media"
があり、これらをうまく取得する方法を模索しています。
/* * 対象のオブジェクトを取得 ***************************************************/ function getObj(){ var obj = { "obj": { "library": [ {"area":"library","post_type":"media","media_id":"10"}, {"area":"library","post_type":"comment","comment_id":"100"} ], "timeline": [ {"area":"timeline","post_type":"comment","comment_id":"100"}, {"area":"timeline","post_type":"comment","comment_id":"200", "attached": { "media":[ {"area":"timeline","post_type":"media","media_id":"10"} ] } }, {"area":"timeline","post_type":"comment","comment_id":"300", "attached": { "media":[ {"area":"timeline","post_type":"media","media_id":"10"}, {"area":"timeline","post_type":"media","media_id":"20"} ] } } ] } } return obj; }
###試したこと・不安
こちらのコードでいちおう出来てはいるものの、抽出の流れに不安がございます。
https://jsfiddle.net/xw6e8gb7/
関数get_extractObj
は、targetObj
からtargetId
のオブジェクトを抽出するという機能です。
抽出の対象が親階層の場合は問題ないと思います。
しかし子階層の場合は、まず親オブジェクトの取得を経る次の➀➁➂の流れになっていまして、これが無駄なのではないか?と不安に思いました。
➀get_extractObj()
の引数にparentId
とparentType
という親情報を渡し、
➁そこからparentObj
という親オブジェクトを取得し、
➂その中から改めてextractObj
という目的のオブジェクトを抽出する。
###質問
親情報を渡したり親オブジェクトの取得を経なくても、extractObj
を抽出する方法があるのではないか?と思い、その方が引数が減りますし、処理も早くなりそう(?)なので質問させて頂きました。
どなたかお詳しい方がいらっしゃいましたら、どうぞ宜しくお願い致します。
###jsfiddleのコード
先述したjsfiddleのコードになります。
/* * target_objから、target_idのオブジェクトを抽出 ***************************************************/ function get_extractObj( targetObj, area, targetType, targetId, parentType=null, parentId=null ){ let extractObj; const areaObj = targetObj['obj'][area]; // 親階層について、targetIdのオブジェクトを抽出 if( parentType==null ){ extractObj = areaObj.find( e=>e[targetType+'_id'] && e[targetType+'_id'] === targetId ); } // 子階層について、parentIdのオブジェクトのattachedから、targetIdのオブジェクトを抽出 if( parentType!=null ){ const parentObj = areaObj.find( e=>e[parentType+'_id'] && e[parentType+'_id'] === parentId ); extractObj = parentObj['attached'][targetType].find( e=>e[targetType+'_id'] && e[targetType+'_id'] === targetId ); } // 抽出結果 return extractObj; } /* * 実行 ***************************************************/ // 親の抽出 ( media ) var result1 = get_extractObj( getObj(), 'library', 'media', '10' ); console.log('result1:',result1); // 親の抽出 ( comment ) var result2 = get_extractObj( getObj(), 'library', 'comment', '100' ); console.log('result2:',result2); // 子の抽出 ( media ) var result3 = get_extractObj( getObj(), 'timeline', 'media', '10', 'comment', '200' ); console.log('result3:',result3);
回答1件
あなたの回答
tips
プレビュー