comparando y agregando elementos a una matriz de objetos

Se supone que el siguiente código:

1) ir a través de las dos matrices,

2) si existe un elemento en ambas matrices, agregue su valor al valor del elemento similar en la primera matriz,

3) si el elemento se encuentra en arr2 pero no arr1, agregue el elemento a arr1. Mi código funciona según lo deseado cuando ambas matrices tienen el mismo tamaño, pero esto es lo que obtengo con matrices de diferente tamaño.

Resultado:

[[42, “Bowling Ball”], [4, “Calcetín sucio”], [2, “gato”], [6, “tazas”], [2, “Calcetín sucio”], [3, “trapos” ]]

debiera ser:

[[42, “Bola de bolos”], [4, “Calcetín sucio”], [2, “gato”], [3, “trapos”], [3, “tazas”]]

Y aquí está mi código:

function updateInventory(arr1, arr2) { for (var i = 0; i < arr1.length; i++) { for (var j = i; j  arr1.length) { arr1.push(arr2[arr2.length -1]); } else break; } } return arr1; } var curInv = [ [21, "Bowling Ball"], [2, "Dirty Sock"], [2, "cat"], ]; var newInv = [ [21, "Bowling Ball"], [2, "Dirty Sock"], [3, "rags"], [3, "mugs"] ]; updateInventory(curInv, newInv); 

Cuál es el problema aquí?

Podría usar una tabla hash para el inventario y verificar y actualizar currInv .

 var curInv = [[21, "Bowling Ball"], [2, "Dirty Sock"], [2, "cat"], ], newInv = [[21, "Bowling Ball"], [2, "Dirty Sock"], [3, "rags"], [3, "mugs"]], inventory = Object.create(null); curInv.forEach(function (a) { this[a[1]] = a; }, inventory); newInv.forEach(function (a) { if (!this[a[1]]) { this[a[1]] = [0, a[1]]; curInv.push(this[a[1]]); } this[a[1]][0] += a[0]; }, inventory); console.log(curInv); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

Estás sobre-complicando las cosas, creo. Aquí hay un fragmento de trabajo.

 function updateInventory(arr1, arr2) { for (var i = 0; i < arr2.length; i++) { var matchFound = false; for (var j = 0; j < arr1.length; j++) { if (arr1[j][1] === arr2[i][1]) { arr1[j][0] += arr2[i][0]; matchFound = true; } } if (!matchFound) { arr1.push(arr2[i]); } } return arr1; } var curInv = [ [21, "Bowling Ball"], [2, "Dirty Sock"], [2, "cat"], ]; var newInv = [ [21, "Bowling Ball"], [2, "Dirty Sock"], [3, "rags"], [3, "mugs"] ]; console.log(updateInventory(curInv, newInv)); 

Puede combinar los arreglos O combinar el arreglo para que automáticamente haga lo que usted desea.

var array3 = curInv.concat (newInv);

Si quieres encontrar los elementos únicos.

// Fusiona ambas matrices y obtiene elementos únicos var array3 = **

 arrayUnique(array1.concat(array2)); function arrayUnique(array) { var a = array.concat(); for(var i=0; i 

**

Aquí hay una solución de estilo de progtwigción funcional concisa que utiliza un hash (un Map realidad) para la eficiencia:

 function updatedInventory(a, b) { return Array.from( b.reduce( (m, [v,k]) => m.set(k, (m.get(k) || 0) + v), new Map(a.map ( ([v,k]) => [k,v] )) ), // swap pairs ([k,v]) => [v,k]) // swap back afterwards; } // Sample data var curInv = [ [21, "Bowling Ball"], [2, "Dirty Sock"], [2, "cat"], ]; var newInv = [ [21, "Bowling Ball"], [2, "Dirty Sock"], [3, "rags"], [3, "mugs"] ]; // call the function curInv = updatedInventory(curInv, newInv); // Output the result console.log(curInv); 
 .as-console-wrapper { max-height: 100% !important; top: 0; }