###実現したいこと
対象の配列から
【A】idの配列
【B】ソートされたオブジェクトの配列
を取得したいです。
いちおう処理はできたのですが、いかんせん素人レベルのコピペだらけで、余計な処理があるように思います。
それが最後にあるソースコードですが、もっとスッキリさせた書き方にできないかと思っています。
もしアドバイスいただけましたら幸いです。
###対象の配列
まずこれが対象の配列です。ここから【A】【B】を取得したいわけです。
const iniArray = [ {id: '1', x_num: '100', y_num: null, z_num: null }, {id: '2', x_num: null, y_num: '400', z_num: null }, {id: '3', x_num: null, y_num: null, z_num: '300' }, {id: '4', x_num: null, y_num: '200', z_num: null } ];
###【A】
対象の配列から extKeys
の指定値 が null
でないオブジェクトの id
の配列を取得するのが【A】です。
たとえば extKeys = [ 'x_num', 'y_num' ]
を指定した場合ならば、これらがnull
である3
を除外して、次の配列がほしいということです。
[ '1', '2', '4' ]
###【B】
対象の配列から extKeys
が null
でないオブジェクトを、「●_num」でソートして取得するのが【B】です。
先の【A】で取得したid
を持つオブジェクトを「●_num」でソートし、次のオブジェクトの配列がほしいということです。
[ {id: '1', x_num: '100', y_num: null, z_num: null }, {id: '4', x_num: null, y_num: '200', z_num: null }, {id: '2', x_num: null, y_num: '400', z_num: null } ];
###素人ながら試したこと
以下があれこれ試行錯誤してできたコードになります。
1、2、3、4という処理ですが、ほしいのは【A】【B】の情報(下記なら1、3の情報)だけなので、もっとスッキリさせた書き方にできないかと思っています。
ご指導ご鞭撻のほど、よろしくお願い申し上げます。
/* 対象の配列 */ const iniArray = [ {id: '1', x_num: '100', y_num: null, z_num: null }, {id: '2', x_num: null, y_num: '400', z_num: null }, {id: '3', x_num: null, y_num: null, z_num: '300' }, {id: '4', x_num: null, y_num: '200', z_num: null } ]; /* 1. extKeysがnullじゃなければidを検索 */ function getExtIds( iniArray, extKeys ){ let array = []; for (let i=0; i < iniArray.length; i++) { for (let j=0; j < extKeys.length; j++) { if( iniArray[i][extKeys[j]] !== null ){ const id = iniArray[i]["id"]; array.push(id); } } } // extKeysが [ 'x_num', 'y_num' ] なので、[ '1', '2', '4' ] が取得される console.log('---検索されたidの配列---'); console.log(array); return array; } /* 2. 検索したidを持つオブジェクトを抽出する */ function getExtObj( iniArray, extIds ){ let array = []; for (let i=0; i < iniArray.length; i++) { for (let j=0; j < extIds.length; j++) { if( iniArray[i]["id"] == extIds[j] ){ const extObj = iniArray.find( e=>e.id && e.id === extIds[j] ); array.push(extObj); } } } console.log('---抽出されたオブジェクト---'); console.log(array); return array; } /* 3. 抽出されたオブジェクトを「●_num」で並び替える */ function getSortObj( extObj ) { return extObj.sort((a,b) => (a.x_num || a.y_num || a.z_num) - (b.x_num || b.y_num || b.z_num)); } /* 4. 処理を実行 */ const extKeys = [ 'x_num', 'y_num' ]; const extIds = getExtIds( iniArray, extKeys ); const extObj = getExtObj( iniArray, extIds ); const result = getSortObj( extObj ); console.log('---「●_num」でソートされたオブジェクト---'); console.log( result );
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/08 09:21