2015-08-30 4 views
3

Я хочу, чтобы объединить и добавить следующий 2D массив:Добавить значения в двумерном массиве с JavaScript

var arr = [ 
    ["TWENTY", 20], 
    ["TWENTY", 20], 
    ["TWENTY", 20], 
    ["TWENTY", 20], 
    ["TEN", 10], 
    ["FIVE", 5], 
    ["ONE", 1], 
    ["QUARTER", 0.25], 
    ["QUARTER", 0.25], 
    ["DIME", 0.1], 
    ["DIME", 0.1], 
    ["PENNY", 0.01], 
    ["PENNY", 0.01], 
    ["PENNY", 0.01], 
    ["PENNY", 0.01] 
    ]; 

Итоговое в 2D массив, который выглядит следующим образом:

arr = [ 
    ["TWENTY", 80], 
    ["TEN", 10], 
    ["FIVE", 5], 
    ["QUARTER", 0.50], 
    ["DIME", 0.20], 
    ["PENNY", 0.04] 
    ]; 

В основном я 'суммируя числовые значения и уплотняя строковые значения. Я попробовал карту, уменьшил, и для циклов, но это меня застопорило.

+2

И что вы пробовали? Я имею в виду, покажи нам какой-то код. – MinusFour

+0

Напишите цикл for, который выполняет итерацию array1, затем внутри цикла for, используйте переключатель, а затем увеличивайте выделенную запись array2 с соответствующим значением из array1. – Zze

ответ

1

Все, что вам действительно нужно, это уменьшить и карту, которая, вероятно, может добавить до хорошей MapReduce шутки.

var arr = [ 
    ["TWENTY", 20], 
    ["TWENTY", 20], 
    ["TWENTY", 20], 
    ["TWENTY", 20], 
    ["TEN", 10], 
    ["FIVE", 5], 
    ["ONE", 1], 
    ["QUARTER", 0.25], 
    ["QUARTER", 0.25], 
    ["DIME", 0.1], 
    ["DIME", 0.1], 
    ["PENNY", 0.01], 
    ["PENNY", 0.01], 
    ["PENNY", 0.01], 
    ["PENNY", 0.01] 
]; 
var obj = arr.reduce(function (out, el) { 
    out[el[0]] = (out[el[0]] || 0) + el[1]; 
    return out; 
}, {}); 
var out = Object.keys(obj).map(function (key) { 
    return [key, obj[key]] 
}); //[["TWENTY",80],["TEN",10],["FIVE",5],["ONE",1],["QUARTER",0.5],["DIME",0.2],["PENNY",0.04]] 
+0

@MichaelLaszlo Спасибо за уловку, видимо, не заметили, так как код по-прежнему работает для целых чисел. Однако он ломается для поплавков. Исправлена. – Nit

+0

Кстати, '|' не добавляет целых чисел. –

+0

@MichaelLaszlo Да, вы можете подтвердить это в своей консоли. Причина, по которой начинается опечатка, заключается в том, что вы можете использовать двоичную операцию '| 0', чтобы отличать вещи от целых чисел в Javascript, так же, как вы можете обеспечить, чтобы что-то было числом, используя' || 0'. – Nit

2

У вас есть массив с key, value кортежами. Вы можете перебирать эти кортежи, хранить каждый новый ключ в объекте и увеличивать значение по мере того, как вы наследуете последующие кортежи одним и тем же ключом. Если вы храните массив ключей в том порядке, в котором вы их встретили, вы можете сопоставить массив ключей с массивом результатов.

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

Ниже приведен уродливый подход. Не делай этого. Сделайте то, что говорит Нит.

function addArray(tuples) { 
 
    var hash = {}, 
 
     keys = []; 
 
    tuples.forEach(function (tuple) { // Iterate over [key, value] tuples. 
 
    var key = tuple[0], 
 
     value = tuple[1]; 
 
    if (hash[key] === undefined) { // Is it a new key? 
 
     keys.push(key);    // Then add it to keys. 
 
     hash[key] = value;   // And set the initial value. 
 
    } else { 
 
     hash[key] += value;   // Otherwise, increment the value. 
 
    } 
 
    }); 
 
    return keys.map(function (key) { // Map the keys to tuples. 
 
    return([key, hash[key]]); 
 
    }); 
 
}; 
 

 
var arr = [ 
 
    ["TWENTY", 20], 
 
    ["TWENTY", 20], 
 
    ["TWENTY", 20], 
 
    ["TWENTY", 20], 
 
    ["TEN", 10], 
 
    ["FIVE", 5], 
 
    ["ONE", 1], 
 
    ["QUARTER", 0.25], 
 
    ["QUARTER", 0.25], 
 
    ["DIME", 0.1], 
 
    ["DIME", 0.1], 
 
    ["PENNY", 0.01], 
 
    ["PENNY", 0.01], 
 
    ["PENNY", 0.01], 
 
    ["PENNY", 0.01] 
 
]; 
 

 
var added = addArray(arr); 
 

 
added.forEach(function (tuple) { 
 
    document.write(JSON.stringify(tuple) + '<br />'); 
 
});