2017-03-10 9 views
0

私は異なるグループからの万人の連絡先を持っています。例えばjavascriptを使用して入れ子になったオブジェクトから重複値を削除します

{"GROUP":[{'G1: [C1,C2,C3........C500000]}, 
      {'G2': [C1,C2,C3........C500000,D1,D2,D3........D500000]} 
.....] 
    } 

G1はG2は既にG1中に存在すること500K接点のうち100万個の接点を有する、500K接点を有します。

条件に基づいて上記のグループオブジェクトをフィルタリングしたい場合は、 "既にグループに属している連絡先をチェックして、それぞれのグループから削除する必要があります"。

期待される結果

{"GROUP":[{'G1: [C1,C2,C3........C500000]}, 
      {'G2': [D1,D2,D3........D500000]},....] 
    } 

はここでグループとその接触のサイズが増加する可能性があります。

lodash javascriptを使用して実装する最善の方法は何ですか?思考の長いプロセスの後、私はあなたのためにこれを持って

答えて

1

あなたは、次に含まれますどのように多くの項目前のオブジェクトから分からない場合は、すべての既存のアイテムを格納する外部の配列、と_.difference()使用することができます。

var object = { 
 
    group: [ 
 
     { g1: ['c1', 'c2', 'c3', 'c4', 'c5']}, 
 
     { g2: ['c1', 'c4', 'c5', 'd1', 'd2', 'd3', 'd4', 'd5']}, 
 
     { g3: ['c1', 'c3', 'c4', 'c5', 'd1', 'd4', 'd5', 'e1', 'e2', 'e3', 'e4', 'e5']} 
 
    ] 
 
}; 
 

 
var previousItems = []; 
 

 
var group = object.group.map(function(item) { 
 
    return _.mapValues(item, function(values) { 
 
    var newValues = _.difference(values, previousItems); 
 
    previousItems = previousItems.concat(newValues); 
 
    return newValues; 
 
    }); 
 
}); 
 

 
console.log(group);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

内のすべての項目であれば前のオブジェクトを次の中に含まれている、あなたは簡単なArray#sliceを使用することができます。

var object = { 
 
    group: [ 
 
     { g1: ['c1', 'c2', 'c3', 'c4', 'c5']}, 
 
     { g2: ['c1', 'c2', 'c3', 'c4', 'c5', 'd1', 'd2', 'd3', 'd4', 'd5']}, 
 
     { g3: ['c1', 'c2', 'c3', 'c4', 'c5', 'd1', 'd2', 'd3', 'd4', 'd5', 'e1', 'e2', 'e3', 'e4', 'e5']} 
 
    ] 
 
}; 
 

 
var prevValues = []; 
 

 
var group = object.group.map(function(item, index) { 
 
    return _.mapValues(item, function(values) { 
 
    var newValues = values.slice(prevValues.length); 
 
    prevValues = values; 
 
    return newValues; 
 
    }); 
 
}); 
 

 
console.log(group);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+0

作品も...私はいくつかの連絡先ではない500百万人をチェックして...それは万人のために働くことを願っています素晴らしいパフォーマンスで接触してください。 – mymotherland

+0

私は非常にクライアントが万人の連絡先を処理できないと確信しています。たとえそれがあっても、パフォーマンスはあまり上がらないでしょう。おそらく処理を複数のWebワーカーに分割する必要があります。この種のものはサーバによって処理されるべきです。 –

+0

はい、ノードjsでindexとsizeを使用した弾性検索APIを使用しています:) – mymotherland

1

それは自動的にオブジェクト/配列構造throught行き、G1、G2、G3、アレイ内の重複文字列を削除...ので、に。

私はロダッシュを一度も使用しませんでしたので、ここではバニラjsです。

var object = { 
 
    group: [ 
 
     { g1: ['a', 'b', 'c', 'd']}, 
 
     { g2: ['a', 'b', 'c', 'd', 'e', 'f', 'g']}, 
 
     { g3: ['f', 'g', 'h', 'i', 'j', 'k', 'l']} 
 
    ] 
 
}; 
 

 
var duplicateArray = []; 
 

 
for(var key in object) { 
 
    var group = object[key]; 
 
    
 
    for(var x = 0; x < group.length; x++) { 
 
     var subGroup = group[x]; 
 
     
 
     for(var subkey in subGroup) { 
 
      var contentArray = subGroup[subkey]; 
 
      
 
      for(var y = 0; y < contentArray.length; y++) { 
 
       var value = contentArray[y]; 
 
      
 
       if(duplicateArray.indexOf(value) == -1) { 
 
        duplicateArray.push(value); 
 
       } else { 
 
        object[key][x][subkey].splice(y, 1); 
 
        y -= 1; 
 
       } 
 
      } 
 
     } 
 
    } 
 
} 
 

 
console.log(`dub ${duplicateArray}`); 
 
console.log(object);

関連する問題