JavaScriptで配列内の重複オブジェクトを削除する方法
例えば、次のようなオブジェクトの配列があったとします。
const arr = [
{"title": "Assistant"},
{"month": "July"},
{"event": "Holiday"},
{"title": "Assistant"}
];ここで求められているのは、このような配列を引数として受け取り、元の配列に含まれるすべてのオブジェクトのうち、重複しているものを除外した新しい配列を返すJavaScript関数を作成することです。
実装例
この処理を実現するコードは以下のようになります。
const arr = [
{"title": "Assistant"},
{"month": "July"},
{"event": "Holiday"},
{"title": "Assistant"}
];
const removeDuplicate = arr => {
const map = {};
for(let i = 0; i < arr.length; ){
const str = JSON.stringify(arr[i]);
if(map.hasOwnProperty(str)){
arr.splice(i, 1);
continue;
};
map[str] = true;
i++;
};
};
removeDuplicate(arr);
console.log(arr);出力結果
コンソールには次のように出力されます。
[ { title: 'Assistant' }, { month: 'July' }, { event: 'Holiday' } ]コードの解説
このアプローチでは、まず各オブジェクトをJSON.stringify()で文字列化し、それをキーとして連想配列(プレーンオブジェクト)に記録していきます。同じ文字列がすでに登録されている場合は重複とみなし、splice()メソッドでその要素を配列から削除します。
ポイントはループのカウンタ変数iの扱いです。要素を削除した際にはiを増やさずに次の反復へ進むことで、削除によって前に詰められた要素を見逃さないようにしています。
また、オブジェクトは参照型であるため、===による単純な比較では中身が同じでも別のオブジェクトとして判定されてしまいます。JSON.stringify()で文字列に変換してから比較することで、プロパティの構成と値が完全に一致するオブジェクト同士を正しく重複として検出できるのです。
-
JavaScriptのlengthプロパティで配列オブジェクトの長さを取得する方法
JavaScriptにおけるlengthプロパティとはJavaScriptのlengthプロパティは、文字列や配列などのオブジェクトが持つ要素数(サイズ)を返すために使用されます。配列の場合は格納されている要素の個数、文字列の場合は文字数を取得できます。ここでは、文字列と配列オブジェクトの長さをlengthプロパティで取得するサンプルコードを紹介します。サンプルコード以下の例では、ボタンをクリックすると配列の長さが画面に表示される仕組みを実装しています。<!DOCTYPE html> <html lang="ja"> <head> <
-
JavaScriptでIDごとにオブジェクトの配列をグループ化する方法
JavaScriptでオブジェクトの配列をidなどの特定のキーごとにグループ化したい場合、reduce()メソッドを使うと簡潔に実装できます。この記事では、どのプロパティにも対応できる汎用的なgroupBy関数を作成し、実際のサンプルコードとともにその仕組みを詳しく解説します。 reduce()によるグループ化の考え方 reduce()は、配列の各要素を順番に処理しながら、1つの累積値(ここではオブジェクト)を組み立てていくメソッドです。各要素からキーの値を取り出し、その値がまだ結果オブジェクトに存在しなければ新しい配列を作成して、そこへ要素を追加していくことでグループ化を実現します。 サ