2017-09-07 3 views
0

二次元配列から重複値を削除する最も良い方法はどれですか?例えば、私の配列は次のようになります。私はbid_array[0]の評価を開始し、bid_array[1]かどうかを確認する必要がありインデックス0から始まる二次元配列の重複値を削除する

var bid_array = [[1,2,3,4,5],[3,4,6,7,8,2],[7,2,4,9,11,15],[10,12,3,7,11]]; 

が存在競合配列から重複した値を削除した場合、bid_array[2]またはbid_array[3]は、すでにbid_array[0]に存在する値が含まれています最後の配列のチェックが終了したら、今度は2番目のインデックス位置(bid_array[1])から開始し、次のサブ配列を確認するために再度進んでください。

私はこれを試していましたが、ただ1つの値が最大2回重複している場合にのみ機能します。例:

for (var i = 0; i < 8; i++) { 
    for (var j = 0; j < bid_array.length; j++) { 
    for (var k = (j + i); k < bid_array.length; k++) { 
     for (var l = 0; l < bid_array[k].length; l++) { 
     if (bid_array[j].indexOf(bid_array[k][l]) > -1) { 
      bid_array[k].splice(l, 1); 
     } 
     } 
    } 
    } 
} 

私が前にいた元の配列のことをしたい:

var bid_array = [[1,2,3,4,5],[3,4,6,7,8,2],[7,2,4,9,11,15],[10,12,3,7,11]]; 

て、結局重複する値を削除し、1つだけ維持:

var bid_array = [[1,2,3,4,5],[6,7,8],[9,11,15],[10,12]]; 

をするための最良の方法は何これは、すべての重複した値が削除されたというセキュリティを持っていますか?ご協力ありがとうございます。

答えて

2

あなたは

var bid_array = [[1,2,3,4,5],[3,4,6,7,8,2],[7,2,4,9,11,15],[10,12,3,7,11]]; 
 

 
let map = {}; 
 
bid_array = bid_array.map(function(element){ 
 
    return element.filter(function(val){ 
 
     if(map[val]) 
 
      return 0; 
 
     map[val] = 1; 
 
     return 1; 
 
    }); 
 
}) 
 

 
console.log(bid_array);

+0

このコードは大いに役立ちます、ありがとうございます。しかし、正確に 'マップ'は何をしますか?私は 'bid_array.map(function(element){...)'の後にコードの一部をしているのかどうかわからない。 –

+0

要素ごとに反復し、その場所に変更された値を返します。 – marvel308

1

あなたはハッシュテーブルとチェックを使用することができ、以下の方法でそれを行うことができます。

function unique(array) { 
 
    var hash = Object.create(null); 
 
    return array.map(function (a) { 
 
     return a.filter(function (b) { 
 
      return !hash[b] && (hash[b] = true); 
 
     }); 
 
    }); 
 
} 
 

 
var array = [[1, 2, 3, 4, 5], [3, 4, 6, 7, 8, 2], [7, 2, 4, 9, 11, 15], [10, 12, 3, 7, 11]]; 
 

 
console.log(unique(array));

Set

function unique(array) { 
 
    var hash = new Set; 
 
    return array.map(a => a.filter(b => !hash.has(b) && hash.add(b))); 
 
} 
 

 
var array = [[1, 2, 3, 4, 5], [3, 4, 6, 7, 8, 2], [7, 2, 4, 9, 11, 15], [10, 12, 3, 7, 11]]; 
 

 
console.log(unique(array));

0

とES5の完全なセットユースケース:

var set = new Set(); 
for(const array of bid_array){ 
var c = 0; 
array.slice().forEach((el,i) => { 
    if(set.has(el)){ 
     array.splice(i-(c++),1); 
    }else{ 
     set.add(el); 
    } 
    }); 
} 
+0

残念ながら、前方反復を実行している間に配列を突然変異させる問題に遭遇します。隣接する2つの番号を削除する必要がある場合は、2つ目の番号をスキップします。 – spanky

+0

@spanky shure? forEachがそれを意識していない場合はshureしないでください... –

+0

うん、 'forEach'は突然変異したものを知る方法がない。それは実際にコレクションの '.length'をキャッシュしてその終わりに行きますが、各インデックスで' HasProperty'チェックを実行するので気付かないので、範囲外になるとコールバックは呼び出されません。これはかなり簡単なループです。 – spanky

関連する問題