2015-03-02 54 views
1

我有對象在JavaScript(D3)的陣列,並且我需要刪除每一個對象,其中一定屬性存在於對象屬性的另一個數組,
左外加入 full outer join使左外連接中的JavaScript

我設法用2個循環自己做,但它很慢。
我不知道如何讓它更快。

for (var i = 0; i < data1.length; i++) { 
     for (var j = 0; j < data2.length; j++) { 
      if (data2[j].attr3 == data1[i].attr4) { 
       data2.splice(j,1); 
      } 
     } 
    } 

data1.length〜2K和data2.length〜10K

我知道這已經大約被要求here但它是近2年,解決方案使用外部庫。
我只是好奇學習,如果有更好的方法與JavaScript(或jQuery或D3,我已經使用)

謝謝你的幫助!

回答

3

您需要存在於data1值的快速查找,所以使用對象進行地圖:

var map = {}; 
for (var i = 0; i < data1.length; i++) { 
    map[data1[i].attr4] = 1; 
} 

然後你就可以循環throught在data2的項目,並將其篩選:

var result = []; 
for (i = 0; i < data2.length; i++) { 
    if (!(data2[i].attr3 in map)) { 
    result.push(data2[i]); 
    } 
} 
+0

好的答案只是一個提示:如果你必須應用這種邏輯的在你的應用程序的陣列,你可以採取下劃線看看 – jean 2015-03-02 13:08:34

1

您可以使用Array.filter(請參閱MDN)或Array.map因爲我想:

var array1 = [1,2,3,4,5,6,7,8,9], 
 
    array2 = [3,4,5,6], 
 
    fltr = array1.filter(function(v) {return this.indexOf(v) < 0;}, array2), 
 
    map = array1.map( 
 
       function(v) { 
 
       var exists = this.indexOf(v); 
 
       return [v, (this[exists] || 'null')].join(', ');}, 
 
       array2), 
 
    result = document.querySelector('#result'); 
 
fltr.unshift('<u>array1</u>'); 
 
map.unshift('<u>array1, array2</u>'); 
 
result.innerHTML = ['<b>filtered</b>\n', 
 
        fltr.join('\n'), 
 
        '\n\n<b>mapped</b>\n', 
 
        map.join('\n')].join(''); 
 
<pre id="result"></pre>