js配列重複排除_javascriptスキルの問題の概要

WBOY
リリース: 2016-05-16 17:02:56
オリジナル
900 人が閲覧しました

1.js オブジェクトのキーの非重複の原則に従って、配列の重複を排除するための最も一般的な考え方によれば、次のような方法が考えられます。以下:

コードをコピー コードは次のとおりです:

function uniqueArray(arr){
var obj={},temp=[];
for(var i=0;iif(!obj[arr[i]]){
temp.push(arr[i]);
obj[arr[i]] =true;
}
}
return temp;
}
var testarr=[1 ,2,3,2];
console.log (distinctArray(testarr));//[1,2,3]

かなり良さそうですが、以下になった場合状況:
var testarr1=[1,2 ,3,"2"];
console.log(distinctArray(testarr));// [1,2,3]
それでも結果は同じですが、これは私たちが望んでいることではありません。結果は [1,2,3,"2"] である必要があります。つまり、重複排除プロセス中に型の整合性を確保する必要があります。

上記の状況を考慮して、上記の方法を改良しました。

コードをコピーします コードは次のとおりです。

function uniqueArray Improvement(arr){
var obj={},temp=[];
for(var i=0;iif(!obj[typeof (arr[i]) arr[i]]){
temp.push(arr[i]);
obj[typeof (arr[i]) arr[i]] =true;
}
}
return temp;
}

上記のメソッドは、オブジェクトにキーを入れるときに typeof プレフィックスを追加するので、その効果を見てみましょう。
var testarr1=[1,2,3,"2"];
console.log(distinctArray(testarr));// [1,2,3,"2"]
おっと、そうではありません悪い!では、この関数はまったく問題ありませんか? 別の状況を見てみましょう。
var testarr1=[1,2,3,"2",{a:1},{b:1}];
console.log(distinctArray(testarr));// [1,2, 3. "2",{a:1}]
この結果が表示されました。なぜ {b:1} が不可解にも削除されたのでしょうか? 重複排除の問題で有用なデータが誤って削除された場合は非常に深刻です。方法は完璧ではないので、引き続き下を向いてみましょう。

2.1 では、主なアイデアは、js オブジェクト内のキーの非反復の概念を使用して思考を導くことですが、最終的には解決できませんでした。すべての問題が解決されたので、必要な機能を実現するために思考モードを変更することを検討できます。

次のように、スライス メソッドとスプライス メソッドを使用して配列の重複排除を実現します。

コードをコピーします コードは次のとおりです。

function uniqueArray2(arr){
var temp=arr.slice(0);//配列を temp
for(var i=0;ifor(j=i 1;jif(temp[j]==temp[i]){
temp.splice(j ,1 );//要素
j--;
}
}
}
return temp;
}

テスト:
var testarr1=[1,2,3,"2"];
console.log(distinctArray(testarr));//[1,2,3]
var testarr2=[1,2, 2, {a:1},{a:1},{a:1,b:2},function(){alert("b");},function(){alert("b");}] ;
//[1,2,{a:1},{a:1},{a:1,b:2},function(){alert("b");},function(){アラート( "b");}]

テスト結果はまだ私たちのニーズを満たしていません。どうすればよいですか?私たちのチームが上記の方法を調査した結果、2 つのオブジェクトが等しいかどうかを比較する操作に主な問題があることがわかりました。distinctArray2 で「==」を使用すると、ビュー内の大きなオブジェクトの内容が等しいかどうかを区別できません。この状況を解決するには、別のメソッドを作成しました:

コードをコピー コードは次のとおりです:

function uniqueArrayAll(arr){
var isEqual=function(obj1,obj2){
//2 つのオブジェクトのアドレスは等しく、等しくなければなりません
if(obj1===obj2){
return true;
}
if(typeof(obj1)==typeof(obj2)){
if(typeof(obj1)=="オブジェクト"&&typeof(obj2)=="オブジェクト"){
var pcount=0;
for(var p in obj1){
pcount ;
if(!isEqual(obj1[p],obj2[p])){
return false;
}
}
for(var p in obj2){
pcount--;
}
return pcount==0;
}else if(typeof(obj1) =="function"&&typeof(obj2)= ="function"){
if(obj1.toString()!=obj2.toString()){
return false;
}
}else {
if(obj1!=obj2 ){
return false;
}
}
}else{
return false;
}
return true;
}
var temp=arr.slice(0);//配列を temp
for(var i=0;ifor(j=i 1) にコピーします;jif(isEqual(temp[j],temp[i])){
temp.splice(j,1);//要素
jを削除します--;
}
}
}
温度を返す;
}

テスト:
var testArr3=[1,2,2,{a:1},{a:1},{a:1,b:2},function(){alert("b") ;},function(){alert("b");}];
console.log(distinctArrayAll(testArr3));
//結果[1,2,{a:1},{a: 1,b:2},function(){alert("b");}]

ああ、ようやく重複を削除するタスクが正常に完了しました。各メソッドのパフォーマンスの問題については、次の議論に譲ります。最後の方法は、複雑な配列を重複排除できるユニバーサル重複排除メソッドであることがわかりますが、実際のプロジェクト開発では、重複排除に必要なのは純粋な数値または文字列だけである場合もあります。これに対応する実行オーバーヘッドも非常に大きくなります。ニーズに応じて対応するアルゴリズムを柔軟に選択できます。完璧を求めるのではなく、ニーズを満たすことに基づいてプログラムをより効率的にすることのみを追求します。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!