2017-08-01 16 views
1

我有一個二維數組數據,如該過濾器的二維數組的唯一行:如何基於在Javascript子元素和點心起動值在同一時間

var arr = [[a,1,b,10],[c,3,d,30],[a,2,b,20],[c,4,d,40]];

我想實現這個結果:

[[a,3,b,30],[c,7,d,70]]

我想排序它和循環然後每個元件陣列比較2子元件與前一個元素陣列中的那些,但是這是沒有效率的。

什麼是最快的方法呢?我的實際數據是數千行。 謝謝。

+1

做'了'和'B'總是一起去?這是一個有效的數組:'[a,1,c,2]'? –

+0

@DevonParsons,是和否 – ltp

回答

1

你可以使用一個散列表來查找想要的相似值並更新數組。

var array = [['a', 1, 'b', 10], ['c', 3, 'd', 30], ['a', 2, 'b', 20], ['c', 4, 'd', 40]], 
 
    hash = Object.create(null), 
 
    result = array.reduce(function (r, a) { 
 
     var key = [0, 2].map(function (i) { return a[i]; }).join('|'); 
 
     if (!hash[key]) { 
 
      hash[key] = a.slice(); 
 
      r.push(hash[key]); 
 
      return r; 
 
     } 
 
     [1, 3].forEach(function (i) { hash[key][i] += a[i]; }); 
 
     return r; 
 
    }, []); 
 
    
 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

快速版本

var array = [['a', 1, 'b', 10], ['c', 3, 'd', 30], ['a', 2, 'b', 20], ['c', 4, 'd', 40]], 
 
    hash = Object.create(null), 
 
    length = array.length, 
 
    result = [], 
 
    element, i, key, ref; 
 

 
for (i = 0; i < length; i++) { 
 
    element = array[i]; 
 
    key = array[i][0] + '|' + array[i][2]; 
 
    ref = hash[key]; 
 
    if (ref) { 
 
     ref[1] += element[1]; 
 
     ref[3] += element[3]; 
 
     continue; 
 
    } 
 
    hash[key] = element.slice(); 
 
    result.push(hash[key]); 
 
} 
 
    
 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

This works。謝謝。 – ltp

+1

'key = array [i] [0] +'|' + array [i] [0];'應該是'key = array [i] [0] +'|' + array [i] [2];',對嗎? – ltp

+0

@ltp,正確的發現。 –

相關問題