JavaScript配列 重複値抽出方法
JavaScriptで配列から重複値を取得する
問題
配列内の重複する値(複数回出現する値)をすべて取得したい。
解決方法
Setオブジェクトを使用
- Setは重複する要素を保持しないため、元の配列と比較することで重複する値を抽出できます。
function getDuplicates(arr) { const uniqueSet = new Set(arr); return arr.filter(item => !uniqueSet.has(item)); }
- 各要素をキーとしてオブジェクトにカウントを保持し、カウントが1より大きい要素を抽出します。
function getDuplicates(arr) { const countMap = {}; return arr.filter(item => { countMap[item] = (countMap[item] || 0) + 1; return countMap[item] > 1; }); }
reduceメソッドとオブジェクトを使用
- reduceメソッドで要素をカウントし、カウントが1より大きい要素を抽出します。
function getDuplicates(arr) { return arr.reduce((acc, cur) => { acc[cur] = (acc[cur] || 0) + 1; return acc; }, {}) .filter((count, item) => count > 1) .map((count, item) => item); }
例
const arr = [1, 2, 3, 2, 4, 5, 1];
const duplicates = getDuplicates(arr);
console.log(duplicates); // Output: [1, 2]
JavaScript配列 重複値抽出方法のコード解説
方法1: Setオブジェクトを使用
function getDuplicates(arr) {
const uniqueSet = new Set(arr);
return arr.filter(item => !uniqueSet.has(item));
}
- arr.filter(item => !uniqueSet.has(item))
元の配列arr
をフィルタリングし、Set オブジェクトに含まれない要素(つまり、重複する要素)のみを抽出します。 - new Set(arr)
元の配列arr
から重複する要素を除いた新しい Set オブジェクトを作成します。
function getDuplicates(arr) {
const countMap = {};
return arr.filter(item => {
countMap[item] = (countMap[item] || 0) + 1;
return countMap[item] > 1;
});
}
- return countMap[item] > 1;
カウントが1より大きい場合、つまり重複する要素である場合にtrue
を返します。 - countMap[item] = (countMap[item] || 0) + 1;
現在の要素item
のカウントをインクリメントします。 - const countMap = {};
各要素のカウントを保持するための空のオブジェクトを作成します。
function getDuplicates(arr) {
return arr.reduce((acc, cur) => {
acc[cur] = (acc[cur] || 0) + 1;
return acc;
}, {})
.filter((count, item) => count > 1)
.map((count, item) => item);
}
- .map((count, item) => item)
抽出された要素の値のみを配列に返します。 - .filter((count, item) => count > 1)
カウントが1より大きい要素のみを抽出します。 - arr.reduce()
配列arr
を要素ごとに処理し、カウントを保持するオブジェクトを返します。
indexOf と lastIndexOf を使用
function getDuplicates(arr) {
return arr.filter((item, index) => arr.indexOf(item) !== arr.lastIndexOf(item));
}
- arr.indexOf(item) !== arr.lastIndexOf(item)
要素が複数回出現する場合、最初のインデックスと最後のインデックスが異なるため、重複していると判断します。 - arr.lastIndexOf(item)
配列arr
内で要素item
が最後に現れるインデックスを取得します。
reduce と Object.values を使用
function getDuplicates(arr) {
return Object.values(arr.reduce((acc, cur) => {
acc[cur] = (acc[cur] || 0) + 1;
return acc;
}, {})).filter(count => count > 1).map(() => arr[0]);
}
- .map(() => arr[0])
抽出された要素の値を配列に返します。 - Object.values()
オブジェクトの値を配列として取得します。
Set と filter を使用(逆転)
function getDuplicates(arr) {
const uniqueSet = new Set(arr);
return arr.filter(item => uniqueSet.has(item) && !uniqueSet.delete(item));
}
- arr.filter(item => uniqueSet.has(item) && !uniqueSet.delete(item))
元の配列arr
をフィルタリングし、Set オブジェクトに含まれる要素であり、かつ削除に成功した要素(つまり、重複する要素)のみを抽出します。
javascript arrays