Me encontré con este desafío para mi curso que no puedo resolver por mi vida.
Se le da una función con un solo parámetro que es una matriz anidada con objetos.
function sortProducts (matrix) `enter code here`La matriz (matriz) se ve así:
[ [ { product: "MacBook", price: 1019, category: 'tech'}, { product: "Cheerios", price: 5, category: 'food'}, ], [ { product: "Snickers", price: 1.5 , category: 'food'}, { product: "Air Pods", price: 129, category: 'tech'}, ], ];Instrucciones: Dentro de la matriz matriz, cada matriz anidada contiene objetos. Cada objeto representa un producto.
La función debe recorrer la matriz y crear un nuevo objeto que contenga los productos ordenados por categoría. Luego, la función debe devolver este objeto de resultado que contiene productos clasificados, almacenados en propiedades tecnología y alimentos.
El objeto de resultado debe tener la siguiente estructura:
{ tech: [ { tech product }, { tech product } ], food: [ { food product }, { food product } ], };Entonces, según tengo entendido, el primer paso sería recorrer la matriz para crear este nuevo objeto. Este objetado tendría que ordenar los productos por categoría en el formato (tech: 'tech product', food: 'food product'.
Sé que la respuesta va a ser tan simple, pero no puedo hacerlo por mi vida.
Una forma sería aplanar la matriz primero usando flatMap() y luego usar reduce para agrupar por categoría. Aquí hay un ejemplo:
let arr = [ [ { product: "MacBook", price: 1019, category: 'tech'}, { product: "Cheerios", price: 5, category: 'food'}, ], [ { product: "Snickers", price: 1.5 , category: 'food'}, { product: "Air Pods", price: 129, category: 'tech'}, ], ] let result = arr.flatMap(i => i).reduce((c, p) => { c[p.category] = c[p.category] || []; c[p.category].push(p); return c; }, {}); console.log(result)No entiendo por qué se llama "sortProducts", no clasifica, solo analiza o convierte la entrada en otro objeto.
Prueba algo como esto:
function sortProducts(matrix){ var result = {}; for (let i = 0; i < matrix.length; i++) { const arr = matrix[i]; for (let j = 0; j < arr.length; j++) { const obj = arr[j]; var newObj = { product: obj.product, price: obj.price}; // If result already has the category then just push the new object if (result[obj.category]) { result[obj.category].push(newObj); continue; } // Otherwise add the category and add the object inside an array // This automaticly ensures that the result.category is an array result[obj.category] = [newObj]; } } return result; }Así que la solución fue aún más simple de lo que pensaba :'(
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, } }No tengo idea de cómo no me di cuenta de eso. Ojalá pueda continuar esta curva de aprendizaje.