JavaScriptでオブジェクト内の配列から特定のキー値を検索して取得する方法
以下のようなJSONオブジェクトがあると仮定します。各キー(カテゴリ名)には、productId を持つオブジェクトの配列が格納されています。
const obj = {
"LAPTOP": [{
"productId": "123"
}],
"DESKTOP": [{
"productId": "456"
}],
"MOUSE": [{
"productId": "789"
}, {
"productId": "012"
}],
"KEY-BOARD": [{
"productId": "345"
}]
};要件
このようなオブジェクトを第1引数として受け取り、キーと値のペア(オブジェクト)を第2引数として受け取るJavaScript関数を作成する必要があります。
キーと値のペアとは、基本的に次のようなオブジェクトのことです。
const pair = {"productId": 456};作成する関数は、指定された productId に一致する要素が含まれているキーをオブジェクト全体から検索し、そのキーを返すものとします。
実装例
実際のコードは以下の通りです。
const obj = {
"LAPTOP": [{
"productId": "123"
}],
"DESKTOP": [{
"productId": "456"
}],
"MOUSE": [{
"productId": "789"
}, {
"productId": "012"
}],
"KEY-BOARD": [{
"productId": "345"
}]
};
const searchByPair = (obj = {}, pair = {}) => {
const toSearch = Object.values(pair)[0];
let required = undefined;
Object.keys(obj).forEach((key) => {
if(obj[key].find((pid) => pid.productId === toSearch)){
required = key;
}
});
return required;
};
console.log(searchByPair(obj, {
'productId': '123'
}));コードの解説
- Object.values(pair)[0]:検索対象となる値(ここでは productId の値)をペアオブジェクトから取り出します。
- Object.keys(obj).forEach(...):元のオブジェクトのすべてのキーを順番に走査します。
- Array.prototype.find():各キーに紐づく配列の中に、指定された productId と一致する要素が存在するかどうかを確認します。
- 一致する要素が見つかった場合は、そのキーを変数 required に保存し、最終的にその値を返します。
出力結果
コンソールには次のように出力されます。
LAPTOP
このように searchByPair 関数を使えば、ネストされたオブジェクト構造の中から、特定の値を持つキーを簡単に特定できます。なお、複数のキーが同じ値を持つ可能性がある場合は、forEach の代わりに reduce や filter を活用して、一致するすべてのキーを配列として取得する方法も検討するとよいでしょう。
-
JavaScriptのオブジェクト配列に配列メソッドを適用する方法
JavaScriptでは、オブジェクトが格納された配列に対しても、通常の配列と同じようにpop()、push()、splice()などの標準的な配列メソッドをそのまま使用できます。オブジェクト配列はあくまで「配列」であるため、要素としてオブジェクトが入っていても配列操作のAPIは共通で動作します。 コード例 以下は、JavaScriptオブジェクトの配列に対して配列メソッドを使用するサンプルコードです。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8
-
JavaScriptで2つのオブジェクトを比較しながら配列のネストされた値をグループ化する方法
この記事では、2つのオブジェクト(before と after)を比較しながら、ネストされた配列の値を1つの行にグループ化する方法を解説します。データの差分を表形式で整理したい場合などに役立つテクニックです。入力データの例まず、次のようなJSONオブジェクトがあるとします。before(変更前)と after(変更後)の2つの状態が含まれ、それぞれの device 配列の中に、id、price、features(機能名と価格)というネストされた構造を持っています。const input = { before: { device: [ { id: 1234