JavaScript配列で、重複した文字列のインデックスを取得するにはどうすればよいですか?
例:
MyArray = ["abc","def","abc"]; //----> return 0,2("abc");
もう一つの例:
My Array = ["abc","def","abc","xyz","def","abc"]
//----> return 0,2,5("abc") and 1,4("def");
これを行う方法がわかりません。よろしくお願いします。
JavaScript配列で、重複した文字列のインデックスを取得するにはどうすればよいですか?
例:
MyArray = ["abc","def","abc"]; //----> return 0,2("abc");
もう一つの例:
My Array = ["abc","def","abc","xyz","def","abc"]
//----> return 0,2,5("abc") and 1,4("def");
これを行う方法がわかりません。よろしくお願いします。
更新 01/2022 : もう 2013 年ではなく、多くのことが変更されました。プロトタイプを変更することはお勧めしません。また、配列に対して数回の反復が必要になるため、この回答のアプローチは「最良」ではありません。
これは、元の回答の更新版であり、その精神と以下の元の回答を保持しています。
function getDuplicates<T>(input: T[]): Map<T, number[]> {
return input.reduce((output, element, idx) => {
const recordedDuplicates = output.get(element);
if (recordedDuplicates) {
output.set(element, [...recordedDuplicates, idx]);
} else if (input.lastIndexOf(element) !== idx) {
output.set(element, [idx]);
}
return output;
}, new Map<T, number[]>());
}
さらに別のアプローチ:
Array.prototype.getDuplicates = function () {
var duplicates = {};
for (var i = 0; i < this.length; i++) {
if(duplicates.hasOwnProperty(this[i])) {
duplicates[this[i]].push(i);
} else if (this.lastIndexOf(this[i]) !== i) {
duplicates[this[i]] = [i];
}
}
return duplicates;
};
キーが重複したエントリで、値がインデックスを持つ配列であるオブジェクトを返します。
["abc","def","abc"].getDuplicates() -> { "abc": [0, 2] }