たとえば、文字列を含むJS配列があります。
var strArray = [ "q", "w", "w", "e", "i", "u", "r"];
配列内の重複文字列を比較する必要があり、重複文字列が存在する場合は、その文字列を指す警告ボックスが必要です。
私はそれをfor
ループと比較しようとしましたが、比較するための事前に決められた文字列なしに、配列が自身の文字列の重複をチェックするようにコードを書く方法がわかりません。
findDuplicates関数は、配列内のすべてのアイテムのインデックスを、同じアイテムの最初の出現のインデックスと比較します。インデックスが同じでない場合は、重複として返します。
let strArray = [ "q", "w", "w", "w", "e", "i", "u", "r"];
let findDuplicates = arr => arr.filter((item, index) => arr.indexOf(item) != index)
console.log(findDuplicates(strArray)) // All duplicates
console.log([...new Set(findDuplicates(strArray))]) // Unique duplicates
function checkIfDuplicateExists(w){
return new Set(w).size !== w.length
}
console.log(
checkIfDuplicateExists(["a", "b", "c", "a"])
// true
);
console.log(
checkIfDuplicateExists(["a", "b", "c"]))
//false
}
var strArray = [ "q", "w", "w", "e", "i", "u", "r", "q"];
var alreadySeen = [];
strArray.forEach(function(str) {
if (alreadySeen[str])
alert(str);
else
alreadySeen[str] = true;
});
連続していない複製が見つかることを示すために、元の複製をもう1つ追加しました。
配列でのsome関数の使用:配列内のアイテムの先頭からのインデックス番号が末尾からのインデックス番号と等しくない場合、このアイテムは配列内に複数回存在します。
// Vanilla js
function hasDuplicates(arr) {
return arr.some( function(item) {
return arr.indexOf(item) !== arr.lastIndexOf(item);
});
}
大きな配列を操作する場合は、パフォーマンスを向上させるためにオブジェクトキーを使用します(その場合、各要素をループし、重複をチェックするために再度ループするのは非常に遅くなります)。
var strArray = ["q", "w", "w", "e", "i", "u", "r"];
var counting = {};
strArray.forEach(function (str) {
counting[str] = (counting[str] || 0) + 1;
});
if (Object.keys(counting).length !== strArray.length) {
console.log("Has duplicates");
var str;
for (str in counting) {
if (counting.hasOwnProperty(str)) {
if (counting[str] > 1) {
console.log(str + " appears " + counting[str] + " times");
}
}
}
}
次のコードでは、nique-filter(アイテムのすべての出現が最初の出現であるかどうかを確認)から配列内のユニークなアイテムの数をアイテムの総数と比較 =:両方が等しい場合、配列には一意の要素のみが含まれ、それ以外の場合は重複があります。
var firstUnique = (value, index, array) => array.indexOf(value) === index;
var numUnique = strArray.filter(firstUnique).length;
var allUnique = strArray.length === numUnique;