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

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

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

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

Q&A

4回答

510閲覧

条件に合った配列のインデックスの取り出し方について

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

1クリップ

投稿2022/11/27 10:47

条件に一致した配列のインデックスを取り出したい。

実現したい内容

let array = [ 25, 15, 40, 70, 20 ] で 25以上の数値のもののインデックスを出力したい。

試したこと

①passIndexを使用してみましたが 0 が出力されてしまった。

let M = 25

let passIndex = array.findIndex(function(element){
return element >= M;
});

配列の中身を取ることは、できたのですがインデックスで取得する方法が
わからず苦戦しております。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/11/27 10:53

> 0 が出力されてしまった。 とのことだけど、arrayの先頭要素は25で、25 は M (=25) 以上を満たすので、 そのインデクスの0 を返すのは正しい結果だけれども? 0がダメだとすると期待値は何でしょうか〜?
退会済みユーザー

退会済みユーザー

2022/11/27 10:55

期待値を記述するのを忘れておりました。すいません。 期待値は 0,2,3 です。
退会済みユーザー

退会済みユーザー

2022/11/27 11:44

期待値あざす 3案出しました、よろしくですうー
guest

回答4

0

こうしてもよいかも

javascript

1let M = 25; 2let array = [ 25, 15, 40, 70, 20 ]; 3let indexs= array.map((_,x)=>x).filter(x=>array[x]>=M); 4console.log(indexs);

投稿2022/11/28 00:48

yambejp

総合スコア114837

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

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

0

passIndexを使用してみましたが 0 が出力されてしまった。

.findIndex()は、配列の中で条件に合う「最初の要素」が何番目にあるかを戻すメソッドです。
25以上の数字が配列の0番目にあるため、0を戻し、そこで処理を終了します。

コード例

私でしたら.flatMap()メソッドを利用します。

javascript

1const array = [25, 15, 40, 70, 20]; 2const M = 25; 3const passIndex = array.flatMap((num, idx) => num >= M ? idx : []); 4console.log(passIndex); // [0, 2, 3]

.flatMap()について

.map()(配列の値を書き換え)ながら、.flat()(配列を一段階平坦化。2次元配列なら→1次元配列化)し、新しい配列を生成してくれるメソッドです。

javascript

1配列.flatMap( (現在の要素, インデックス) => return 新しい値 )

私のコードの場合、

  • 条件に合致していたら、その要素のインデックス番号に書き換え
  • 合致していなかったら、空の配列に[]書き換え
    • [0, [], 2, 3, []] ←一旦、こういう状態になる
  • そして、↑の配列が平坦化されるときに空の配列は消え失せる

という処理をしています。

三項演算子について

?:の部分は、三項演算子という記法で、if/elseを1行でかけます。

javascript

1条件 ? trueの場合の値 : falseの場合の値

if/elseとの比較です。

javascript

1const number = 10 2 3// 三項演算子 4const result = number >= 5 ? '5以上だよ!' : '5未満だよ…'; 5console.log(result); // '5以上だよ!' 6 7// if/else 8let result2; 9 10if (number >= 5) { 11 result2 = '5以上だよ!' ; 12} else { 13 result2 = '5未満だよ…'; 14} 15console.log(result2); // '5以上だよ!'

投稿2022/11/27 11:55

編集2022/11/27 11:57
Cocode

総合スコア2314

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

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

0

普通にループするのも参考までに書いときますね

javascript

1const array = [25, 15, 40, 70, 20]; 2const M = 25; 3let passIndex = []; 4for (let i=0;i<array.length;i++) 5 if (array[i]>=M) passIndex.push(i); 6console.log(passIndex);

投稿2022/11/27 12:56

takasima20

総合スコア7458

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

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

0

期待値は
0,2,3 です。

ふむふむ。であれば

javascript

1const array = [ 25, 15, 40, 70, 20 ]; 2const M = 25; 3 4const passIndexes = array.reduce((ary, e, i) => e >= M ? [...ary, i] : ary, []); 5 6console.log(passIndexes); // => [0, 2, 3]

とかですかね〜

【別案1】再帰関数

javascript

1const findIndexes = (ary, min, start=0) => { 2 const index = ary.findIndex(e => e >= min); 3 return index >= 0 ? [start+index, ...findIndexes(ary.slice(index+1), min, start+index+1)] : []; 4}

というのを作っておいて、

javascript

1const array = [ 25, 15, 40, 70, 20 ]; 2const M = 25; 3const passIndexes = findIndexes(array, M); 4 5console.log(passIndexes); // => [0, 2, 3]

とする。

【別案2】mapしてfilterしてまたmapするっていう3工程になってしまうけれど、

javascript

1const array = [ 25, 15, 40, 70, 20 ]; 2const M = 25; 3const passIndexes = array.map((e, i) => ({ e, i })).filter(({ e }) => e >= M).map(({ i }) => i); 4 5console.log(passIndexes); // => [0, 2, 3]

【別案3】上の【別案2】を見直したらmapとfilterの2工程で済みました。

javascript

1const array = [ 25, 15, 40, 70, 20 ]; 2const M = 25; 3const passIndexes = array.map((e, i) => e >= M ? i : -1).filter(n => n >= 0); 4 5console.log(passIndexes); // => [0, 2, 3]

投稿2022/11/27 11:06

編集2022/11/27 15:15
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問