【JavaScript】オブジェクトの配列から特定の名前に紐づくユーザーIDをすべて取得する方法
JavaScriptでは、ユーザー名と一意のIDをマッピングしたオブジェクトの配列を扱う場面はよくあります。例えば、次のような配列を考えてみましょう。
const arr = [
{"4": "Rahul"},
{"7": "Vikram"},
{"6": "Rahul"},
{"3": "Aakash"},
{"5": "Vikram"}
];この配列を見ると分かるように、同じ名前が複数のIDに紐づくことはあっても、1つのIDが複数の名前に対応することはありません。
実現したいこと
ここで作成するのは、以下のような仕様の関数です。
- 第1引数: オブジェクトの配列を受け取る
- 第2引数: 検索対象となる名前の文字列を受け取る
- 戻り値: 第2引数で指定した名前に紐づくすべてのIDを格納した配列を返す
実装例(forループを使う方法)
まずは、forループを使った基本的な実装から見ていきましょう。
const arr = [
{"4": "Rahul"},
{"7": "Vikram"},
{"6": "Rahul"},
{"3": "Aakash"},
{"5": "Vikram"}
];
const name = 'Vikram';
const findUserId = (arr, name) => {
const res = [];
for(let i = 0; i < arr.length; i++){
const key = Object.keys(arr[i])[0];
if(arr[i][key] !== name){
continue;
};
res.push(key);
};
return res;
};
console.log(findUserId(arr, name));コードの解説
Object.keys()を使って、各オブジェクトのキー(つまりID)を取得します。各オブジェクトはキーを1つしか持たないため、[0]で最初の要素を取り出せば十分です。- オブジェクトの値が検索対象の名前と一致しない場合は
continueで次の要素へスキップします。 - 一致した場合のみ、そのキー(ID)を結果配列
resに追加します。 - ループが完了したら、収集したIDの配列を返します。
出力結果
上記のコードを実行すると、コンソールには次のように出力されます。
['7', '5']
'Vikram' という名前に紐づくIDは '7' と '5' の2つであるため、正しく両方が取得できていますね。
別解:filterとmapを組み合わせたモダンな書き方
forループを使わず、filter() と map() を組み合わせることで、より宣言的で読みやすいコードに書き換えることもできます。
const findUserId = (arr, name) => arr .filter(obj => Object.values(obj)[0] === name) .map(obj => Object.keys(obj)[0]); console.log(findUserId(arr, 'Vikram')); // ['7', '5']
この方法では、まず filter() で名前が一致するオブジェクトだけを抽出し、続いて map() でそれらのキー(ID)だけを取り出しています。処理の意図がひと目で分かるため、チーム開発などでも可読性の高いコードと言えるでしょう。
-
JavaScriptのArray.from()メソッドとは?使い方と実例をわかりやすく解説
Array.from()メソッドは、配列風オブジェクト(array-like)や反復可能オブジェクト(iterable)から、新しい配列オブジェクトを作成するための便利なメソッドです。文字列、Map、Set、NodeListなど、さまざまなデータを手軽に配列へ変換できます。 Array.from()の基本的な動作 例えば、文字列「HelloWorld」に対してArray.from()を使用すると、1文字ずつ分割された新しい配列が生成されます。以下に実際のコード例を示します。 サンプルコード <!DOCTYPE html> <html lang="ja"&g
-
JavaScriptでオブジェクトを新しい配列に変換する方法
JavaScriptでは、オブジェクトのプロパティやネストされたデータを取り出し、扱いやすい形で新しい配列にフォーマットできます。本記事では、学校(school)オブジェクトに含まれる生徒情報を、文字列形式の配列へ変換する実践的なコード例を紹介します。 ポイントとなるテクニック このサンプルでは、以下の2つのJavaScript機能を活用しています。 分割代入(Destructuring assignment):オブジェクトから特定のプロパティを簡潔に取り出す構文です。 for...of ループ:配列内の各要素を順番に処理するために使用します。 コード例 <!DOCTYPE html