2017-03-24 5 views
1

質問を簡略化するために、オブジェクトがjqliteオブジェクトで、angular.equals関数を使用して、それらが等しいかどうかを確認できます。私の質問は、jqLit​​eオブジェクトの配列から重複した項目を削除するにはどうすればよいですか?ここアレイから重複したオブジェクトを効率的に削除するにはどうすればよいですか?

私が試みものである:

// Suppose jqArr is the array stated above: 
var result = []; 

angular.forEach(jqArr, function(v_i){ 
    if(result.length === 0){ 
     result.push(v_i); 
    } else { 
     var isPushed = false; 
     angular.forEach(result, function(v_j){ 
     if(angualr.equals(v_i, v_j)){ 
      isPushed = true; 
     } 
     }); 
     if(isPushed === false){ 
     result.push(v_i); 
     } 
    } 
}) 
console.log(result); 

e_i(単数または複数)jQLite要素であると仮定jqArr = [E_1、E_2、E_3、E_1、E_2]。 出力は次のようになります。

[e_1, e_2, e_3] 

* JavaScriptのみとangularJsを使用して答えてください。

+0

[JavaScript配列から重複を取り除く]の複製があります。(http://stackoverflow.com/questions/9229645/remove-duplicates-from-javascript-array) – JEY

答えて

1

あなたはそうのようなES6 Setを使用することができます。

let arr = [1,1,2,2,2,3,4,5,6,6,6,6,6]; 
let uniq = [...new Set(arr)]; 

uniqの配列は、一意の値が含まれます。 Arayがオブジェクトリファレンスで満たされていれば、自然に動作します。

+0

私はこれを私のクロームで、arr = [1 、1、{a:1}、2,2,3,4、{a:1}、6,6,6,6,6]。 let uniq = [... new Set(arr)];私はこの結果を得る:[1、オブジェクト、2、3、4、オブジェクト、6]。これはクロームバージョンの問題ですか? –

+0

オブジェクトリテラルを配列内に直接挿入することによって、新しいオブジェクトを作成しています。それらは2つの異なるオブジェクトです。あらかじめオブジェクトを宣言し、配列にオブジェクトへの参照を2回挿入した場合は、私が提供したメソッドよりもうまく動作します。これを思い出してください: '{a:1}!== {a:1}'。しかし、 'let o = {a:1}; o === o; ' – Greg

0

より抽象的な形で、あなたは(indexOfSetと同じ)O(n^2)アルゴリズムを実行しているが、すべての要素が削除を収集された後あなたは、チェックせずにリストにすべての要素を追加することによって、O(nlogn)に複雑さを軽減することができます重複はソートされます(ソート後に重複を削除するには、配列を1回だけ通過する必要があります)。

このソリューションは、すべての重複を保存できる場合にのみ機能します。これは、「重複率」が100%を超えているため効率的ではありません。

ロジックソートを実行できない場合、ハッシュ関数でも同じ結果が得られます。

関連する問題