2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【JavaScript】everyとSetで配列要素の条件式を作る方法

Posted at

サンプルコード

AtCoder的な問題を解いている際に覚えた「every」「Set」の使い方について、かんたんに記事にまとめてみました。

今回取り上げるコードは、ユーザーが入力した配列 a に対して以下を判定しています。

  • aの全要素が 1以上100以下
  • 要素に重複がない

これらの判定を行う中で、特に便利なのが Array.prototype.everySet です。

以下は、everyとSetの使い方についてなるべく短縮したサンプルコードです。

// ユーザーの入力を受け取る処理
let a = require('fs').readFileSync('/dev/stdin','utf8').split(' ').map(Number);

// everyとSetを使って要素を評価。結果がtrueなら要素全体を出力、falseならerrorを出す
console.log(a.every(x=>x>=1&&x<=100) && new Set(a).size===a.length ? a : 'error');

1. everyメソッドで配列の要素を評価

ここからは各要素について解説していきます。

every は「配列のすべての要素が条件を満たすか」を判定します。
このコードでは以下のように使われています。

a.every(x => x >= 1 && x <= 100)

aはユーザーが入力した配列で、every(x =>では配列内の要素について条件に当てはまるかを判定しています。

xはただの変数名のため、基本なんでも大丈夫です。適当に設定しましょう。

上記の例で行っていることは

  1. 各要素 x を順番に評価
  2. x1以上 かつ 100以下 なら true
  3. すべての要素が true なら最終的に true を返す

every の特徴は、ひとつでも条件を満たさない要素があれば即座に false を返す点です。これにより無駄なループ処理を省けます。

2. Setで配列の重複判定をシンプルに

Set は重複のない値のコレクションです。配列から Set を作ると、重複要素は自動的に除去されます。
このコードでは以下のように書かれています。

new Set(a).size === a.length

ここで比較しているのは:

  • new Set(a).size とは重複を除いた要素数
  • a.length とは元の配列の要素数

両者が等しければ「重複なし」、異なれば「重複あり」 となります。

今回の例では、ユーザーが以下のような入力をすれば最終的にtrueとなります。

1 2 3 4 5
>>>true

出力 : [ 1, 2, 3, 4, 5 ] 

逆にfalseの場合は、

1 2 3 4 4
>>>false

出力 : error

おまけ : 「?」を使った条件式について

最終的に、このコードは以下のような三項演算子を使って条件をまとめています。

(条件1 && 条件2) ? a : 'error'

この 「?」 とは、条件式がtrueかfalseかを判定し、条件がすべてtrueならaを出力し、何か1つでもfalseならerrorを出力します。

三項演算子を用いることで、if文を使わず短く書くことができます。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?