JavaScriptは、配列の重複要素を削除する5つの効率的なアルゴリズムです.
3161 ワード
1.行列法を巡回
一番簡単に重い方法で、 構想を実現します.新しい配列を作成して、導入された配列を遍歴します.値は新しい配列に加えられません.注意点:値が配列にあるかどうかを判断する方法「indexOf」はECMAScript 5の方法で、IE 8以下はサポートされていません.いくつかの互換性の低いバージョンのブラウザコードを書く必要があります.ソースは以下の通りです.
この方法の実行速度は他のいかなる方法よりも速いです.つまり、占有メモリは少し大きいです.構想を実現します:新しいjsオブジェクトと新しい行列を作って、行列に入る時、jsオブジェクトのキーかどうかを判断します.そうでないと、オブジェクトにこのキーを追加して、新しい配列を入れます.注意点: jsオブジェクトキーかどうかを判断すると、入ってきたキーに対して自動的に「toString()」を実行します.異なるキーは同じと誤認される可能性があります.例えば、a[1]、a[1].上記の問題を解決するにはやはり「indexOf」を呼び出します.
「indexOf」と呼ばれる性能は方法1と同じです.構想を実現します.現在の配列のi番目の項目が現在の配列の中で初めて出現する位置がiではないなら、i番目の項目は重複しています.無視します.結果配列を保存します.
元の配列の「sort」の並び方はあまり頼りになりませんが、順序を重んじない重さの中ではこの欠点は影響しません.インプリメンテーションの考え方:入力された配列に並べ替え、並べ替え後の同じ値が隣接し、新しい配列は前の値と重複しない値だけを加える.
外国の博文に由来し、この方法の実現コードはかなりクールです.構想を実現します.重複していない一番右の値を取って、新しい配列を入れます.(重複値が検出されたら現在のサイクルを終了してトップサイクルに入る次のラウンドの判定)
一番簡単に重い方法で、 構想を実現します.新しい配列を作成して、導入された配列を遍歴します.値は新しい配列に加えられません.注意点:値が配列にあるかどうかを判断する方法「indexOf」はECMAScript 5の方法で、IE 8以下はサポートされていません.いくつかの互換性の低いバージョンのブラウザコードを書く必要があります.ソースは以下の通りです.
//
function unique1(array){
var n = []; //
//
for(var i = 0; i < array.length; i++){
// i , ,
// push
if (n.indexOf(array[i]) == -1) n.push(array[i]);
}
return n;
}
// indexOf ,indexOf ecmaScript5 IE8 ( IE8, IE8 ecma5)
if (!Array.prototype.indexOf){
// indexOf
Array.prototype.indexOf = function(item){
var result = -1, a_item = null;
if (this.length == 0){
return result;
}
for(var i = 0, len = this.length; i < len; i++){
a_item = this[i];
if (a_item === item){
result = i;
break;
}
}
return result;
}
}
2.対象キーの対法この方法の実行速度は他のいかなる方法よりも速いです.つまり、占有メモリは少し大きいです.構想を実現します:新しいjsオブジェクトと新しい行列を作って、行列に入る時、jsオブジェクトのキーかどうかを判断します.そうでないと、オブジェクトにこのキーを追加して、新しい配列を入れます.注意点: jsオブジェクトキーかどうかを判断すると、入ってきたキーに対して自動的に「toString()」を実行します.異なるキーは同じと誤認される可能性があります.例えば、a[1]、a[1].上記の問題を解決するにはやはり「indexOf」を呼び出します.
// , ( )
function unique2(array){
var n = {}, r = [], len = array.length, val, type;
for (var i = 0; i < array.length; i++) {
val = array[i];
type = typeof val;
if (!n[val]) {
n[val] = [type];
r.push(val);
} else if (n[val].indexOf(type) < 0) {
n[val].push(type);
r.push(val);
}
}
return r;
}
3.配列下標判定法「indexOf」と呼ばれる性能は方法1と同じです.構想を実現します.現在の配列のi番目の項目が現在の配列の中で初めて出現する位置がiではないなら、i番目の項目は重複しています.無視します.結果配列を保存します.
function unique3(array){
var n = [array[0]]; //
//
for(var i = 1; i < array.length; i++) {
// i i,
// i , 。
if (array.indexOf(array[i]) == i) n.push(array[i]);
}
return n;
}
4.並べ替え後、隣接除去法元の配列の「sort」の並び方はあまり頼りになりませんが、順序を重んじない重さの中ではこの欠点は影響しません.インプリメンテーションの考え方:入力された配列に並べ替え、並べ替え後の同じ値が隣接し、新しい配列は前の値と重複しない値だけを加える.
// ,
function unique4(array){
array.sort();
var re=[array[0]];
for(var i = 1; i < array.length; i++){
if( array[i] !== re[re.length-1])
{
re.push(array[i]);
}
}
return re;
}
5.遍歴グループ法を最適化する外国の博文に由来し、この方法の実現コードはかなりクールです.構想を実現します.重複していない一番右の値を取って、新しい配列を入れます.(重複値が検出されたら現在のサイクルを終了してトップサイクルに入る次のラウンドの判定)
// :
function unique5(array){
var r = [];
for(var i = 0, l = array.length; i < l; i++) {
for(var j = i + 1; j < l; j++)
if (array[i] === array[j]) j = ++i;
r.push(array[i]);
}
return r;
}