読み込み中...

JavaScriptでsome()を使って配列内の値をチェックする方法10選

JavaScriptのsome()メソッドを使った配列のチェック JS
この記事は約17分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

●some()メソッドとは?

皆さん、JavaScriptの配列操作で悩んだことはありませんか?

特に、配列内の要素が特定の条件を満たしているかどうかをチェックしたい場面で、どのようなメソッドを使えばいいのか迷ってしまうことがあると思います。

そんな時に役立つのが、JavaScriptの組み込みメソッドの一つである「some()」です。

some()メソッドは、配列内の要素が指定された条件を満たすかどうかをチェックし、真偽値を返してくれます。

これを使えば、配列内に特定の値が含まれているかや、要素が条件を満たしているかなどを簡単に判定できるのです。

○some()の基本的な使い方

では早速、some()メソッドの基本的な使い方について見ていきましょう。

some()メソッドは、配列に対して使用し、コールバック関数を引数として受け取ります。

このコールバック関数は、配列の各要素に対して実行され、その要素が条件を満たす場合にtrueを返します。

配列内の要素が1つでも条件を満たせば、some()メソッドはtrueを返し、そうでない場合はfalseを返します。

コールバック関数には、現在の要素、インデックス、配列自体の3つの引数が渡されます。

これらを使って、柔軟な条件判定を行うことができます。

○サンプルコード1:配列内に条件を満たす要素があるかチェックする

実際にコードを見ながら、some()メソッドの使い方を理解していきましょう。

まずは、配列内に特定の値が含まれているかどうかをチェックする例です。

const numbers = [1, 2, 3, 4, 5];
const hasEvenNumber = numbers.some(function(num) {
  return num % 2 === 0;
});
console.log(hasEvenNumber); // 出力結果: true

このコードでは、numbersという配列に対してsome()メソッドを使用しています。

コールバック関数では、各要素が2で割り切れるかどうかを判定しています。

配列内に偶数が含まれている場合、hasEvenNumberにはtrueが代入されます。

実行結果を見ると、numbersには偶数の2と4が含まれているため、trueが出力されていますね。

○some()とevery()の違い

ここで、some()メソッドと似たような動作をするevery()メソッドについても触れておきましょう。

every()メソッドは、配列内の全ての要素が条件を満たす場合にtrueを返します。

つまり、some()メソッドは「少なくとも1つの要素が条件を満たせばtrue」なのに対し、every()メソッドは「全ての要素が条件を満たさなければfalse」となります。

some()とevery()の違いを理解しておくことで、状況に応じて適切なメソッドを選択できるようになります。

配列内の要素をチェックする際は、求める結果に合わせてsome()とevery()を使い分けていきましょう。

●some()を使った実用的な例

前章では、some()メソッドの基本的な使い方について学びましたね。

配列内の要素が条件を満たすかどうかをチェックできるsome()は、実際の開発現場でもよく使われるメソッドです。

そこで今度は、もう少し実用的なsome()の使用例を見ていきましょう。

複数の条件をチェックしたり、オブジェクトの配列を扱ったり、アロー関数を使ってコードをシンプルにしたりと、様々なテクニックを身につけることができますよ。

○サンプルコード2:複数の条件をチェックする

まずは、複数の条件を同時にチェックする方法から見ていきましょう。

例えば、配列内の要素が特定の範囲内にあるかどうかを判定したい場合などに便利です。

const numbers = [10, 20, 30, 40, 50];
const isInRange = numbers.some(function(num) {
  return num >= 25 && num <= 45;
});
console.log(isInRange); // 出力結果: true

このコードでは、numbersという配列の要素が25以上45以下の範囲内にあるかどうかを判定しています。

コールバック関数内で、「num >= 25」と「num <= 45」の2つの条件をAND演算子(&&)で結合しているのがポイントですね。

実行結果は、30と40がこの範囲内に収まっているため、trueが出力されます。

○サンプルコード3:オブジェクトの配列をチェックする

次に、オブジェクトの配列を扱う場合のsome()の使い方を確認しておきましょう。

オブジェクトのプロパティを条件にしてチェックを行うことができます。

const users = [
  { name: "山田", age: 25 },
  { name: "鈴木", age: 32 },
  { name: "佐藤", age: 18 },
];
const hasAdult = users.some(function(user) {
  return user.age >= 20;
});
console.log(hasAdult); // 出力結果: true

ここでは、usersという配列内のオブジェクトを走査し、ageプロパティが20以上の要素があるかどうかを判定しています。

コールバック関数の引数としてオブジェクトを受け取り、そのプロパティにアクセスしているのが特徴ですね。

実行結果からわかるように、山田さんと鈴木さんのageが20以上なので、trueが出力されています。

○サンプルコード4:アロー関数を使ってシンプルに書く

せっかくなので、アロー関数を使ってコードをよりシンプルに書く方法も覚えておきましょう。

アロー関数を使えば、コールバック関数をより簡潔に表現できます。

const numbers = [1, 2, 3, 4, 5];
const hasEvenNumber = numbers.some((num) => num % 2 === 0);
console.log(hasEvenNumber); // 出力結果: true

先ほどのサンプルコード1をアロー関数で書き換えたのがこちらのコードです。

function キーワードを省略し、引数のカッコと中括弧を省いて、アロー(=>)を使って一行で表現しています。

実行結果は同じくtrueですが、コードがよりスッキリとしましたね。

慣れてくると、このようにアロー関数を活用するのも良いでしょう。

○サンプルコード5:空の配列をチェックする

最後に、空の配列をチェックする場合のsome()の動作についても確認しておきましょう。

空の配列に対してsome()を呼び出すと、どのような結果になるでしょうか。

const emptyArray = [];
const hasElement = emptyArray.some((element) => true);
console.log(hasElement); // 出力結果: false

このコードでは、emptyArrayという空の配列に対してsome()を使用しています。

コールバック関数は常にtrueを返すような単純な条件になっています。

実行結果は、falseが出力されましたね。

空の配列に対してsome()を呼び出した場合、コールバック関数は一度も実行されないため、常にfalseを返すのです。

●some()のよくあるエラーと対処法

さて、some()メソッドを使う上で、初心者のうちはエラーに悩まされることもあるでしょう。

でも、大丈夫です。

よくあるエラーのパターンを知っておけば、すぐに対処できるようになりますよ。

ここでは、some()を使う際に遭遇しがちな3つのエラーと、その対処法について見ていきましょう。

コードを書く時に気をつけるポイントを押さえて、バグのないプログラムを目指しましょう。

○エラー1:条件式の間違い

まずは、条件式の間違いから起こるエラーについて説明します。

some()のコールバック関数内で、条件式を正しく書かないと、意図しない結果になってしまいます。

const numbers = [10, 20, 30, 40, 50];
const hasGreaterThan100 = numbers.some(function(num) {
  return num > 100;
});
console.log(hasGreaterThan100); // 出力結果: true (期待する結果はfalse)

このコードでは、numbersの要素が100より大きいかどうかを判定したいのですが、実行結果はtrueになっています。

これは、条件式が「num > 100」ではなく、誤って「num < 100」と書かれているためです。

このような間違いを防ぐには、条件式をよく確認することが大切ですね。

「>」と「<」の向きや、等号の有無などを念入りにチェックしましょう。

○エラー2:配列でない変数にsome()を使う

次に、配列でない変数にsome()を使ってしまうエラーについて見ていきます。

some()は配列のメソッドなので、配列以外のオブジェクトに対して呼び出すとエラーが発生します。

const notAnArray = "Hello, World!";
const hasLetter = notAnArray.some(function(char) {
  return char === "o";
});
console.log(hasLetter); // エラー発生: TypeError: notAnArray.some is not a function

ここでは、notAnArrayという文字列変数に対してsome()を使おうとしています。

しかし、文字列はsome()メソッドを持たないため、エラーが発生してしまいます。

このエラーを回避するには、some()を使う前に、対象の変数が本当に配列かどうかを確認することが必要です。

Array.isArray()メソッドを使って、変数の型をチェックするのが良いでしょう。

if (Array.isArray(notAnArray)) {
  const hasLetter = notAnArray.some(function(char) {
    return char === "o";
  });
  console.log(hasLetter);
} else {
  console.log("配列ではありません。");
}

このように、型チェックを行ってから処理を進めれば、エラーを未然に防ぐことができます。

○エラー3:コールバック関数の書き方ミス

最後は、コールバック関数の書き方を間違えてしまうエラーです。

some()に渡すコールバック関数の引数や中身を正しく書かないと、期待通りの結果が得られません。

const numbers = [1, 2, 3, 4, 5];
const hasEvenNumber = numbers.some(function() {
  num % 2 === 0;
});
console.log(hasEvenNumber); // 出力結果: false (期待する結果はtrue)

このコードでは、numbersの中に偶数があるかどうかを判定したいのですが、実行結果はfalseになっています。

コールバック関数の引数numが指定されておらず、また、return文が書かれていないためです。

このようなミスを防ぐには、コールバック関数の引数と中身を注意深く書くことが大切です。

引数は正しい名前で受け取り、条件式の結果をreturnするようにしましょう。

const hasEvenNumber = numbers.some(function(num) {
  return num % 2 === 0;
});

このように修正すれば、期待通りの結果が得られるはずです。

●some()の応用テクニック

さて、ここまでsome()メソッドの基本的な使い方やエラー対処法について学んできましたね。

皆さんは、もうsome()を使いこなせるようになったのではないでしょうか。

でも、まだまだsome()の可能性は広がっています。

ここからは、より発展的なsome()の応用テクニックを見ていきましょう。

カスタム条件関数や非同期処理との組み合わせ、他のメソッドとの連携など、実践的なテクニックが満載ですよ。

○サンプルコード6:カスタム条件関数を使う

まずは、カスタム条件関数を使ってsome()の条件判定をより柔軟に行う方法から見ていきましょう。

これまでのサンプルコードでは、コールバック関数の中で直接条件式を書いていましたが、条件判定の処理を別の関数に切り出すこともできるんです。

次のコードを見てみましょう。

function isMultipleOfThree(num) {
  return num % 3 === 0;
}

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const hasMultipleOfThree = numbers.some(isMultipleOfThree);
console.log(hasMultipleOfThree); // 出力結果: true

ここでは、isMultipleOfThree関数を定義し、引数numが3の倍数かどうかを判定しています。

そして、some()のコールバック関数として、このisMultipleOfThree関数を渡しているのがポイントです。

このように、条件判定の処理を別の関数に切り出すことで、コードの可読性や再利用性が向上しますね。

複雑な条件判定を行う場合や、他の場所でも同じ判定を使いたい場合などに活用できるテクニックです。

○サンプルコード7:非同期処理とsome()を組み合わせる

次に、非同期処理とsome()を組み合わせる方法について見ていきましょう。

通常、some()は同期的に処理を行いますが、コールバック関数内で非同期処理を行うこともできるんです。

function checkUrlExists(url) {
  return new Promise((resolve) => {
    const img = new Image();
    img.onload = () => resolve(true);
    img.onerror = () => resolve(false);
    img.src = url;
  });
}

async function checkUrls(urls) {
  const result = await Promise.all(urls.map((url) => checkUrlExists(url)));
  return result.some((exists) => exists);
}

const urls = [
  "https://example.com/image1.jpg",
  "https://example.com/image2.jpg",
  "https://example.com/image3.jpg",
];

checkUrls(urls).then((exists) => {
  console.log(exists); // 出力結果: true または false
});

このコードでは、checkUrlExists関数を定義し、URLが有効な画像を指しているかどうかを非同期的にチェックしています。

そして、checkUrls関数内で、Promise.allとmap()を使ってすべてのURLをチェックし、その結果に対してsome()を適用しているのがポイントです。

非同期処理の結果を配列として受け取り、その配列に対してsome()を使うことで、非同期的な条件判定ができるようになります。

このテクニックは、外部APIとの通信や、ファイルの読み込みなど、非同期処理が必要な場面で活躍しますよ。

○サンプルコード8:some()とfind()を組み合わせて要素を取得する

続いて、some()とfind()メソッドを組み合わせて、条件を満たす要素を取得する方法を見ていきましょう。

some()は条件を満たす要素が存在するかどうかを判定しますが、実際にその要素を取得することはできません。

そこで、find()メソッドと組み合わせることで、目的の要素を取得できるようになります。

const users = [
  { id: 1, name: "山田", age: 20 },
  { id: 2, name: "鈴木", age: 30 },
  { id: 3, name: "佐藤", age: 40 },
];

function findUserById(users, userId) {
  if (users.some((user) => user.id === userId)) {
    return users.find((user) => user.id === userId);
  } else {
    return null;
  }
}

const user = findUserById(users, 2);
console.log(user); // 出力結果: { id: 2, name: "鈴木", age: 30 }

ここでは、findUserById関数を定義し、usersの配列からidが一致するユーザーを取得しています。

まず、some()を使ってidが一致するユーザーが存在するかどうかを判定し、存在する場合はfind()を使ってそのユーザーを取得しているのがポイントです。

このように、some()とfind()を組み合わせることで、条件を満たす要素の存在チェックと、その要素の取得を効率的に行うことができます。

データの検索や、特定の条件を満たすオブジェクトの取得などに活用できるテクニックですね。

○サンプルコード9:some()とfilter()を使って条件に合う要素を抽出する

さらに、some()とfilter()メソッドを組み合わせて、条件に合う要素を抽出する方法も見ておきましょう。

filter()は、配列から条件を満たす要素を抽出して新しい配列を作成するメソッドです。

some()と組み合わせることで、条件に合う要素が存在するかどうかの判定と、その要素の抽出を一度に行うことができます。

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];

function getMultiplesOfThree(numbers) {
  if (numbers.some((num) => num % 3 === 0)) {
    return numbers.filter((num) => num % 3 === 0);
  } else {
    return [];
  }
}

const multiplesOfThree = getMultiplesOfThree(numbers);
console.log(multiplesOfThree); // 出力結果: [3, 6, 9]

ここでは、getMultiplesOfThree関数を定義し、numbersの配列から3の倍数を抽出しています。

まず、some()を使って3の倍数が存在するかどうかを判定し、存在する場合はfilter()を使ってその要素を抽出しているのがポイントです。

このテクニックを使えば、配列内に目的の要素が存在するかどうかを確認しつつ、その要素だけを抽出することができます。

大量のデータから必要な情報を取り出す場合などに威力を発揮しますよ。

○サンプルコード10:some()を使った値の存在チェック

最後に、some()を使った値の存在チェックについて見ておきましょう。

配列内に特定の値が存在するかどうかを判定する場合、some()を使うことで簡潔に書くことができます。

const fruits = ["apple", "banana", "orange", "grape"];

function hasFruit(fruits, fruit) {
  return fruits.some((item) => item === fruit);
}

console.log(hasFruit(fruits, "banana")); // 出力結果: true
console.log(hasFruit(fruits, "melon")); // 出力結果: false

ここでは、hasFruit関数を定義し、fruitsの配列内に指定されたフルーツが存在するかどうかを判定しています。

some()のコールバック関数で、配列の要素と指定された値を比較しているのがポイントですね。

シンプルながら、配列内の値の存在チェックには欠かせないテクニックです。

条件が複雑になる場合は、カスタム条件関数と組み合わせるのも良いでしょう。

まとめ

この記事では、JavaScriptのsome()メソッドについて、基本から応用まで幅広く解説してきました。

some()を使った配列のチェック方法や、実用的なサンプルコード、エラー対処法、そして応用テクニックまで、充実した内容だったと思います。

これからは、ここで身につけたスキルを活かして、より効率的で可読性の高いコードを書いていきましょう。

開発現場でも自信を持ってsome()メソッドを使いこなせるはずです!