Как фильтровать уникальные строки двумерного массива на основе вложенных элементов и суммируемых значений одновременно в Javascript

1

У меня есть данные массива 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 подэлемента с теми, что были в предыдущем массиве элементов, но это неэффективно.

Какой самый быстрый способ сделать это? Мои фактические данные - это тысячи строк. Спасибо.

  • 1
    Есть и a b всегда идут вместе? Это допустимый массив: [a,1,c,2] ?
  • 0
    @DevonParsons, да и нет
Теги:
arrays

1 ответ

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
    Это работает. Благодарю.
  • 1
    key = array[i][0] + '|' + array[i][0]; должен быть key = array[i][0] + '|' + array[i][2]; , правильно?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню