たとえばこんな配列があります
["A01002001","りんご","ばなな","B01001001","A02002001","トマト"]
この中からこ以下を取り出したいのです
A☆☆☆☆☆001
Aから始まって001で終わるもの
詳細な手順としては
(for)
Aから始まるものを全部取り出し(if&indexof)
その次に001で終わるものをとりだす。(if&lastindexof)
これが手順なのでしょうか?
もっといい方法があれば教えてください
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
for 文
私は質問者さんが提案した方法も悪いとは思いません。
一部で for
文を使ったコードを敬遠する向きもありますが、パフォーマンス面では優位性が見られますし、可読性も慣れの範疇だと思います。
最も、更に効率のいい書き方はあります。
JavaScript
1'use strict'; 2/** 3 * for 文 4 */ 5function searchArray1 (array) { 6 var results = []; 7 8 for (var i = 0, l = array.length, value; i < l; ++i) { 9 value = array[i]; 10 11 if (value.charAt(0) === 'A' && value.lastIndexOf('001', value.length - 1) !== -1) { 12 results.push(value); 13 } 14 } 15 16 return results; 17} 18 19function searchArray2 (array) { 20 var results = []; 21 22 for (var i = 0, l = array.length, value; i < l; ++i) { 23 value = array[i]; 24 25 if (value.charAt(0) === 'A' && value.slice(-3) === '001') { 26 results.push(value); 27 } 28 } 29 30 return results; 31} 32 33function searchArray3 (array) { 34 var results = []; 35 36 for (var i = 0, l = array.length, value; i < l; ++i) { 37 value = array[i]; 38 39 if (/^A.*001$/.test(value)) { 40 results.push(value); 41 } 42 } 43 44 return results; 45}
Array.prototype.filter
発想はすでに提案されているコードと同じですが、Function.prototype.bind
を使う事で少しだけすっきりさせる事が出来ます。
JavaScript
1/** 2 * Array.prototype.filter 3 */ 4function searchArray4 (array) { 5 return array.filter(RegExp.prototype.test.bind(/^A.*001$/)); 6} 7 8var searchArray5 = (function (test) { 9 return function searchArray5 (array) { 10 return array.filter(test); 11 }; 12}(RegExp.prototype.test.bind(/^A.*001$/)));
後者コード(searchArray5)は RegExp.prototype.test
を毎回辿るコストを軽減する工夫を入れています。
ベンチマーク
Google Chrome 54.0.2840.99 m で検証したところでは概ね「searchArray2 > searchArray1 > searchArray3 > searchArray5 > searchArray4」の順に高速な結果が出ました。
JavaScript
1searchArray1: 1227.054ms 2searchArray2: 714.375ms 3searchArray3: 787.879ms 4searchArray4: 1561.711ms 5searchArray5: 1525.616ms
Re: a_yanyan さん
投稿2016/12/19 14:48
総合スコア18162
0
ベストアンサー
正規表現を利用すれば条件は1発で抜けると思います
javascript
1var a=["A01002001","りんご","ばなな","B01001001","A02002001","トマト"]; 2var b=a.filter(function(x){return x.match(/^A.+001$/);}); 3console.log(b) 4
追記
ベタにやるならこんな感じでも結構です。
javascript
1var a=["A01002001","りんご","ばなな","B01001001","A02002001","トマト"]; 2var b=[]; 3for(var i=0;i<a.length;i++){ 4 if(a[i].match(/^A.+001$/)) b.push(a[i]); 5} 6console.log(b)
投稿2016/12/19 07:07
編集2016/12/19 07:29総合スコア114814
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
正規表現で照合していけば、一発で検索できます。
javascript
1var arr = ["A01002001","りんご","ばなな","B01001001","A02002001","トマト"] ; 2var filtered = arr.filter(function(str){ return /^A.+001$/.test(str) });
なお、Array#filter
(MDN)はIE8以下では非対応ですので、IE8までサポートする必要がある場合は要注意です。
投稿2016/12/19 07:07
編集2016/12/19 07:08総合スコア145183
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。