2016-01-08 2 views
-3

У меня есть массив в видеСуммируя массив 2D по «группе»

[ 
['16-24', 192081], 
['16-24', 94452], 
['16-24', 1055], 
['25-34', 192081], 
['25-34', 94452], 
['25-34', 1055], 
... 
] 

У меня есть много элементов в массиве, который я хотел бы сократить до уникальных записей левых. Это пример того, что я хотел бы, чтобы сократить до

[ 
['16-24', 287588], 
['25-34', 287588], 
... 
] 

Очевидно, что цифры здесь надуманный пример. Я просмотрел массив массивов javascript, но я не уверен, как его использовать для достижения этого эффекта.

ответ

1

Используйте reduce() для суммирования и map(), чтобы изменить его в желаемом формате.

var vals = [ 
 
['16-24', 192081], 
 
['16-24', 94452], 
 
['16-24', 1055], 
 
['25-34', 192081], 
 
['25-34', 94452], 
 
['25-34', 1055] 
 
]; 
 

 
var temp = vals.reduce(function (obj, cur) { 
 
    var total = obj[cur[0]] || 0; 
 
    obj[cur[0]] = total + cur[1]; 
 
    return obj; 
 
}, {}); 
 

 
var result = Object.keys(temp).map(function (key) { return [key, temp[key]]; }); 
 
console.log(result);               

1

Вот подход, который рассчитывает сумму «на месте», избегая необходимость того, чтобы создать отдельный объект с сокращением и т.д., а затем преобразовать объект обратно в массив ,

Основной план состоит в том, чтобы добавить к первому вхождению каждого ключа числа из последующих вхождений, а затем отфильтровать последующие вхождения.

function sum(a) { 
    return a.filter(([key, num], idx) => { 
    var first = a.findIndex(([key2]) => key === key2); 
    if (first === idx) return true; 
    a[first][1] += num; 
    }); 
} 

Для каждого кортежа мы используем findIndex найти первый кортеж с тем же ключом. Сравнивая этот индекс с текущим индексом, мы можем определить, является ли текущий кортеж первым вложением. Если да, мы оставляем его в покое (return true;); в противном случае мы отфильтровываем его, но сначала добавляем его значение к первому вхождению. Это позволяет избежать необходимости создавать объект с reduce и т. Д., А затем преобразовывать объект обратно в массив.

Возможно, незнакомый синтаксис ([key, num], idx) - function parameter destructuring. Он принимает первый параметр, предполагает, что это массив, и назначает первый элемент key, а второй - num. Это немного чище, чем ссылаться на a[0] и a[1] из кода.

Смежные вопросы