1.js オブジェクトのキーの非重複の原則に従って、配列の重複を排除するための最も一般的な考え方によれば、次のような方法が考えられます。以下:
function uniqueArray(arr){
var obj={},temp=[];
for(var i=0;i
if(!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;i
if(!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");}]
ああ、ようやく重複を削除するタスクが正常に完了しました。各メソッドのパフォーマンスの問題については、次の議論に譲ります。最後の方法は、複雑な配列を重複排除できるユニバーサル重複排除メソッドであることがわかりますが、実際のプロジェクト開発では、重複排除に必要なのは純粋な数値または文字列だけである場合もあります。これに対応する実行オーバーヘッドも非常に大きくなります。ニーズに応じて対応するアルゴリズムを柔軟に選択できます。完璧を求めるのではなく、ニーズを満たすことに基づいてプログラムをより効率的にすることのみを追求します。