JavaScriptで配列内の要素がすべて一意(ユニーク)かどうかをチェックする方法
JavaScriptで、数値の配列を引数として受け取り、その配列に含まれるすべての数値が一度だけ出現する(=重複が一切ない)場合には true を、そうでない場合には false を返す関数を作成してみましょう。
問題の例
たとえば、次のような入力配列が与えられたとします。
const arr = [12, 45, 6, 34, 12, 57, 79, 4];
この場合、期待される出力は次のとおりです。
const output = false;
これは、数値 12 が配列内に2回出現しているためです。
indexOf と lastIndexOf を使った実装例
この問題は、各要素に対して indexOf() と lastIndexOf() の結果を比較することで解決できます。両者のインデックスが一致しない場合、その要素が複数回出現していることを意味します。
const arr = [12, 45, 6, 34, 12, 57, 79, 4];
const containsAllUnique = (arr = []) => {
const { length: l } = arr;
for(let i = 0; i < l; i++){
const el = arr[i];
const firstIndex = arr.indexOf(el);
const lastIndex = arr.lastIndexOf(el);
if(firstIndex !== lastIndex){
return false;
};
};
return true;
};
console.log(containsAllUnique(arr));出力結果
コンソールには次のように表示されます。
false
補足:Setを使ったより簡潔な方法
ES6で導入された Set オブジェクトを利用すると、同じ処理をもっと短く記述できます。Set は重複した値を持てないため、配列から生成した Set のサイズと元の配列の長さを比較するだけで一意性を判定できます。
const containsAllUnique = (arr = []) => {
return new Set(arr).size === arr.length;
};
console.log(containsAllUnique([12, 45, 6, 34, 12, 57, 79, 4])); // false
console.log(containsAllUnique([12, 45, 6, 34, 57, 79, 4])); // trueなお、indexOf/lastIndexOf 方式は重複を見つけた時点で即座に false を返せるため、大きな配列の先頭付近に重複があるケースでは高速に動作することがあります。一方で Set 方式はコードがシンプルで可読性に優れています。配列のサイズやデータの特性に応じて、両者を使い分けるのがおすすめです。
-
JavaScriptで数値配列内の母音(ASCIIコード)を判定して置換する方法
問題 ここで求められているのは、数値の配列を受け取るJavaScript関数を作成することです。配列の中に、ASCIIコードとして母音(a・e・i・o・u)に該当する数値が存在する場合、その数値を対応する母音の文字に置き換え、変換後の新しい配列を返す必要があります。 考え方 ASCIIコードでは、小文字の母音はそれぞれ「a」= 97、「e」= 101、「i」= 105、「o」= 111、「u」= 117 に対応しています。そこで、String.fromCharCode() を使って各数値を文字に変換し、その文字が母音かどうかを判定すればよいわけです。母音に一致した要素だけを文字へ置き換えます
-
JavaScriptで配列の要素が2乗の関係かどうかをチェックする方法
問題 2つの数値の配列 arr1 と arr2 をそれぞれ第1・第2引数として受け取るJavaScript関数を作成することを考えます。 この関数は、arr2 のすべての要素が、出現順序に関係なく arr1 のいずれかの要素の2乗と一致する場合にのみ true を返し、それ以外の場合は false を返す必要があります。 たとえば、関数への入力が次のようであった場合を考えてみましょう。 入力 const arr1 = [4, 1, 8, 5, 9]; const arr2 = [81, 1, 25, 16, 64]; 出力 const output = true; この場合、81 = 9²、