У меня есть данные массива 2d:
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; }
key = array[i][0] + '|' + array[i][0];
должен быть key = array[i][0] + '|' + array[i][2];
, правильно?
a
b
всегда идут вместе? Это допустимый массив:[a,1,c,2]
?