この種の要件に遭遇する場合があり、配列内の複製要素を削除して1つだけを削除する必要があります。頭に浮かぶ最初の方法は、おそらく2つをループに使用して、重複する要素を比較および削除することです。コードは次のとおりです。
方法1:
コードコピーは次のとおりです。
array.prototype.distinct = function(){
var arr = []、
len = this.length;
for(var i = 0; i <len; i ++){
for(var j = i+1; j <len; j ++){
if(this [i] === this [j]){
j = ++ i;
}
}
arr.push(this [i]);
}
arrを返します。
};
使用方法1より多くのデータが発生した場合、パフォーマンスはさらに悪化します。次に、次の方法を確認し続けてください。
方法2:
コードコピーは次のとおりです。
array.prototype.distinct = function(){
var self =これ、
arr = self.concat()。sort(); //新しい配列を作成してソートします
arr.sort(function(a、b){
if(a === b){
var n = self.indexof(a); //インデックス値を取得します
self.splice(n、1);
}
});
自己を返します。
};
方法2では、並べ替えのカスタムコールバック関数を使用し、IE6/7/8でサポートされていないメソッドであるIndexOFも使用します。もちろん、IndexOFはそれ自体でシミュレートできますが、より大きな問題は、IE6/7/8の種類の方法と標準のブラウザの間にも違いがあることです。 IE6/7/8のソートメソッドを使用するカスタムコールバック関数には多くのトラップがあります。上記のカスタムソートコールバック関数のコードは、IE6/7/8の「欠落数」エラーを直接報告します。コールバック関数がNANを返す場合、このエラーは報告されます。理論的には、ソートコールバック関数は整数のみを返すことができるためです。返品値が無視されていても、まだ他の問題があり、最終的にはそれほど問題はありません。方法2はIE6/7/8では機能しません。
愚か者のw頭から、ここに彼のコードがあります:
コードコピーは次のとおりです。
array.prototype.delrepeat = function(){
var newArray = [];
var provessaltable = {};
for(var i = 0、item;(item = this [i])!= null; i ++){
if(!prosionaltable [item]){
newArray.push(item);
ProvessAltable [item] = true;
}
}
NewArrayを返します。
};
方法3では、一時的なオブジェクトを使用して、配列の要素を保存します。重複した配列要素が発生した場合、無視されます。ただし、次の配列に遭遇した場合:
コードコピーは次のとおりです。
var arr = ['firefox'、1、 '1'];
上記の配列が方法3で使用されている場合、誤って1と「1」を複製要素として削除するため、方法3の少し変更を解決できます。
方法3の変更されたバージョン:
コードコピーは次のとおりです。
array.prototype.distinct = function(){
var arr = []、
obj = {}、
i = 0、
len = this.length、
結果;
for(; i <len; i ++){
result = this [i];
if(obj [result]!== result){
arr.push(result);
obj [result] = result;
}
}
arrを返します。
};
後で、私はFools Wharfに関する記事の最後にあるコメントを読みました。この方法は、Rekeyが提供する方法と同じですが、この方法にはバグもあります。このような2Bアレイに遭遇した場合、大丈夫です:
コードコピーは次のとおりです。
var arr = ['firefox'、1、 '1'、1];
上記の配列はメソッド3で変更され、最後の3つの要素は削除されません。ただし、この種の配列は少し極端です。同じ文字通りサイズと文字列数のデータが遭遇した場合は、このバグを避けるために事前に処理する必要があります。一時的なオブジェクトを使用する方法は、標準のブラウザのソートよりもわずかに高速であり、ソートメソッドのアルゴリズムも各ブラウザで異なるはずです。