質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

1206閲覧

JSの冗長な処理を簡易にしたい

kuroean

総合スコア12

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2019/08/08 08:25

編集2019/08/08 08:27

###実現したいこと
対象の配列から
【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】
対象の配列から extKeysnull でないオブジェクトを、「●_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 );

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まずA

javascript

1const iniArray = [ 2 {id: '1', x_num: '100', y_num: null, z_num: null }, 3 {id: '2', x_num: null, y_num: '400', z_num: null }, 4 {id: '3', x_num: null, y_num: null, z_num: '300' }, 5 {id: '4', x_num: null, y_num: '200', z_num: null } 6]; 7const extKeys = [ 'x_num', 'y_num' ] 8const newArray=iniArray.filter(x=>!extKeys.map(y=>x[y]).every(z=>z==null)).map(x=>x.id); 9console.log(newArray);

つづいてB

javascript

1const newArray2=iniArray 2.filter(x=>!extKeys.map(y=>x[y]).every(z=>z==null)) 3.map(x=>{ 4 x.sort=parseInt(x[Object.keys(x).filter(y=>y.match(/._num$/) && x[y]!=null)[0]]); 5 return x; 6}).sort((x,y)=>x.sort-y.sort).map(x=>{ 7 delete(x.sort); 8 return x; 9}); 10console.log(newArray2);

投稿2019/08/08 08:39

編集2019/08/08 08:48
yambejp

総合スコア114839

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuroean

2019/08/08 09:21

引き続きどうもありがとうございます。目玉が飛び出るくらいスッキリしましたね…!自分のコードと比べて思わず笑ってしまいましたw
guest

0

extKeysnull でないオブジェクトだけピックアップした配列を作る」という関数を作っておけば、両方で使い回せます。

javascript

1/* 2対象の配列 3*/ 4const iniArray = [ 5 {id: '1', x_num: '100', y_num: null, z_num: null }, 6 {id: '2', x_num: null, y_num: '400', z_num: null }, 7 {id: '3', x_num: null, y_num: null, z_num: '300' }, 8 {id: '4', x_num: null, y_num: '200', z_num: null } 9]; 10 11// extkeysでのフィルタリング 12function filtered(arr, extKeys) { 13 return arr.filter(function(item){ 14 return extKeys.some(function(key){ 15 return item[key] !== null; 16 }); 17 }); 18} 19 20// idだけ抽出 21function pickIds(arr, extKeys) { 22 return filtered(arr, extKeys).map(function(item){ 23 return item.id; 24 }); 25} 26 27 28 29//並べ替えた配列 30function sorted(arr, extKeys) { 31 // 補助関数 32 function pickValue(item) { 33 for(var i = 0; i < extKeys.length; ++i) { 34 var val = item[extKeys[i]]; 35 if(val) return val; 36 } 37 } 38 39 // filteredで別な配列が生成するので、そのままsortに投げて問題なし 40 return filtered(arr, extKeys).sort(function(a, b) { 41 const aValue = pickValue(a); 42 const bValue = pickValue(b); 43 if(aValue < bValue) return -1; 44 if(aValue > bValue) return 1; 45 return 0; 46 }); 47}

投稿2019/08/08 08:40

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuroean

2019/08/08 09:26

そのご発想ステキです。かなり使えそうです。どうもありがとうございます。わたしは質問のコードを書くのに2日かけたのですが(笑)、みなさん10分やそこらで出来ちゃうんですね…。
kuroean

2019/08/08 16:26

とても便利なものがたくさんありますね。これは知っておいてよかったです。情報感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問