我有一個二維數組數據,如該過濾器的二維數組的唯一行:如何基於在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子元件與前一個元素陣列中的那些,但是這是沒有效率的。
什麼是最快的方法呢?我的實際數據是數千行。 謝謝。
我有一個二維數組數據,如該過濾器的二維數組的唯一行:如何基於在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子元件與前一個元素陣列中的那些,但是這是沒有效率的。
什麼是最快的方法呢?我的實際數據是數千行。 謝謝。
你可以使用一個散列表來查找想要的相似值並更新數組。
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; }
做'了'和'B'總是一起去?這是一個有效的數組:'[a,1,c,2]'? –
@DevonParsons,是和否 – ltp