Entonces, estoy tratando de clasificar objetos de categoría de alimentos o categoría de tecnología, como un objeto por categorías como resultado final. Tengo esta entrada para los argumentos en mi función y luego mi resultado final debería devolverme un objeto con ambos
{ tech: [ { tech product }, { tech product } ], food: [ { food product }, { food product } ], }Entonces, lo que tengo es una función en la que trato de construir una matriz con objetos que clasifican los productos. Hasta ahora, esto es lo que he podido desarrollar es este código, pero por alguna razón solo obtengo que me devuelva un objeto vacío, no un objeto con ambas categorías como estoy intentando.
function sortProducts (matrix) { const matrixResult = {}; for (i = 0; i < matrix.length; i++){ let techProd = matrix[i]; let techCategory = matrix[i].category; let techCategFilter = techCategory === 'tech'; if (techCategFilter){ let arrTech = [] arrTech.push (techProd[i]); matrixResult.tech = arrTech; } } for (i = 0; i < matrix.length; i++){ let foodProd = matrix[i]; let foodCategory = matrix[i].category; let foodCategFilter = foodCategory === 'food'; if (foodCategFilter){ let arrFood = [] arrFood.push (foodProd[i]); matrixResult.food = arrFood; } } return matrixResult; }¿Qué me estoy perdiendo o dónde me estoy equivocando?
Use reducir o filtrar, según el tamaño de su matriz. Me decidí por forEach, ya que es más fácil de leer.
const result = {}; products.forEach(product => { const category = product.category; if (result[category]) { result[category].push(product); } else { result[category] = [product]; } })Veo varios problemas con este código.
arrFood y arrTech se inicializan cada vez en bucle, por lo que los objetos más antiguos empujados se sobrescriben cada vez en el bloque if y siempre tendrá solo 1 objeto como máximo.foodProd = matrix[i] le dará el objeto del producto alimenticio, pero luego empujará foodProd[i] a la matriz, que supongo que no estará definida.Pruebe esto (arregló los problemas anteriores y también acortó un poco):
function sortProducts (matrix) { const matrixResult = { tech: [], food: []}; for (i = 0; i < matrix.length; i++){ let techProd = matrix[i]; if (techProd.category === 'tech'){ matrixResult.tech.push (techProd); } } for (i = 0; i < matrix.length; i++){ let foodProd = matrix[i]; if (foodProd.category === 'food'){ matrixResult.food.push (foodProd); } } return matrixResult; }también puede usar forEach en lugar de looping o reducer como lo sugiere @HPSingh.
para cada ejemplo:
var matrixResult = { tech: [], food: []}; matrix.forEach( obj => { if(obj.category === 'food') matrixResult.food.push(obj); else if(obj.category === 'tech') matrixResult.tech.push(obj); });Entonces, después de consultar con un colega, recomendó esto, que funcionó muy bien.
function sortProducts (matrix) { const tech = []; const food = []; for (let i = 0; i < matrix.length; i++) { const arr = matrix[i]; for (let j = 0; j < arr.length; j++) { const product = arr[j]; if ( product.category === 'tech') { tech.push(product); } else if (product.category === 'food') { food.push(product); } }; }; return { tech: tech, food: food, } }