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

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

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

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

Q&A

解決済

3回答

1652閲覧

配列の中の検索方法を教えてください

a_yanyan

総合スコア74

JavaScript

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

0グッド

0クリップ

投稿2016/12/19 06:55

たとえばこんな配列があります
["A01002001","りんご","ばなな","B01001001","A02002001","トマト"]
この中からこ以下を取り出したいのです
A☆☆☆☆☆001
Aから始まって001で終わるもの

詳細な手順としては
(for)
Aから始まるものを全部取り出し(if&indexof)
その次に001で終わるものをとりだす。(if&lastindexof)

これが手順なのでしょうか?
もっといい方法があれば教えてください

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

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

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

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

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

guest

回答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

think49

総合スコア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
yambejp

総合スコア114814

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

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

0

正規表現で照合していけば、一発で検索できます。

javascript

1var arr = ["A01002001","りんご","ばなな","B01001001","A02002001","トマト"] ; 2var filtered = arr.filter(function(str){ return /^A.+001$/.test(str) });

なお、Array#filterMDN)はIE8以下では非対応ですので、IE8までサポートする必要がある場合は要注意です。

投稿2016/12/19 07:07

編集2016/12/19 07:08
maisumakun

総合スコア145183

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問