I have 2 2d arrays
var arr1 = [
[1, 'a'],
[2, 'b']
]
var arr2 = [
[3, 'a'],
[5, 'c']
]
var output = [
[4, 'a'],
[2, 'b'],
[5, 'c']
]
.map
function sumArrays (arr1, arr2) {
var output = [];
arr2.map(function(i) {
arr1.map(function(n) {
if (i[1] === n[1]) {
output.push([i[0] + n[0], i[1]])
} else {
output.push(i)
}
})
})
return output;
}
Please use not Array#map
, when you do not need a new array, which this method returns.
You could use a hash table for the inventory and check against and update arr2
with Array#forEach
.
Proposal which uses arr1
for update
var arr1 = [[1, 'a'], [2, 'b']],
arr2 = [[3, 'a'], [5, 'c']],
inventory = Object.create(null);
arr1.forEach(function (a) {
this[a[1]] = a;
}, inventory);
arr2.forEach(function (a) {
if (!this[a[1]]) {
this[a[1]] = [0, a[1]];
arr1.push(this[a[1]]);
}
this[a[1]][0] += a[0];
}, inventory);
console.log(arr1);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Proposal with new array for result
.
var arr1 = [[1, 'a'], [2, 'b']],
arr2 = [[3, 'a'], [5, 'c']],
inventory = Object.create(null),
result = arr1.map(function (a) {
return this[a[1]] = [a[0], a[1]];
}, inventory);
arr2.forEach(function (a) {
if (!this[a[1]]) {
this[a[1]] = [0, a[1]];
result.push(this[a[1]]);
}
this[a[1]][0] += a[0];
}, inventory);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }