|
| 1 | +# Reto 03: Organizando-el-inventario |
| 2 | + |
| 3 | +Santa Claus 🎅 está revisando el inventario de su taller para preparar la entrega de regalos. Los elfos han registrado los juguetes en un array de objetos, pero la información está un poco desordenada. **Necesitas ayudar a Santa a organizar el inventario.** |
| 4 | + |
| 5 | +Recibirás un array de objetos, donde **cada objeto representa un juguete y tiene las propiedades:** |
| 6 | + |
| 7 | +- name: el nombre del juguete (string). |
| 8 | +- quantity: la cantidad disponible de ese juguete (entero). |
| 9 | +- category: la categoría a la que pertenece el juguete (string). |
| 10 | + |
| 11 | +Escribe una función que procese este array y devuelva un objeto que organice los juguetes de la siguiente manera: |
| 12 | + |
| 13 | +- Las claves del objeto serán las categorías de juguetes. |
| 14 | +- Los valores serán objetos que tienen como claves los nombres de los juguetes y como valores las cantidades totales de cada juguete en esa categoría. |
| 15 | +- Si hay juguetes con el mismo nombre en la misma categoría, debes sumar sus cantidades. |
| 16 | +- Si el array está vacío, la función debe devolver un objeto vacío {}. |
| 17 | + |
| 18 | +```js |
| 19 | +const inventary = [ |
| 20 | + { name: 'doll', quantity: 5, category: 'toys' }, |
| 21 | + { name: 'car', quantity: 3, category: 'toys' }, |
| 22 | + { name: 'ball', quantity: 2, category: 'sports' }, |
| 23 | + { name: 'car', quantity: 2, category: 'toys' }, |
| 24 | + { name: 'racket', quantity: 4, category: 'sports' } |
| 25 | +] |
| 26 | + |
| 27 | +organizeInventory(inventary) |
| 28 | + |
| 29 | +// Resultado esperado: |
| 30 | +// { |
| 31 | +// toys: { |
| 32 | +// doll: 5, |
| 33 | +// car: 5 |
| 34 | +// }, |
| 35 | +// sports: { |
| 36 | +// ball: 2, |
| 37 | +// racket: 4 |
| 38 | +// } |
| 39 | + |
| 40 | +const inventary2 = [ |
| 41 | + { name: 'book', quantity: 10, category: 'education' }, |
| 42 | + { name: 'book', quantity: 5, category: 'education' }, |
| 43 | + { name: 'paint', quantity: 3, category: 'art' } |
| 44 | +] |
| 45 | + |
| 46 | +organizeInventory(inventary2) |
| 47 | + |
| 48 | +// Resultado esperado: |
| 49 | +// { |
| 50 | +// education: { |
| 51 | +// book: 15 |
| 52 | +// }, |
| 53 | +// art: { |
| 54 | +// paint: 3 |
| 55 | +// } |
| 56 | +// } |
| 57 | +``` |
| 58 | + |
| 59 | +## Mi solución explicada |
| 60 | + |
| 61 | +```js |
| 62 | +function organizeInventory(inventory) { |
| 63 | + return inventory.reduce( |
| 64 | + (result, { category, name, quantity }) => ( |
| 65 | + (result[category] ??= {}), |
| 66 | + (result[category][name] = ~~result[category][name] + quantity), |
| 67 | + result |
| 68 | + ), |
| 69 | + {}, |
| 70 | + ); |
| 71 | +} |
| 72 | +``` |
| 73 | +
|
| 74 | +Primero utilizamos el método `reduce` para recorrer el array de objetos y obtener un objeto final. El objeto final será el resultado de organizar el inventario. |
| 75 | +
|
| 76 | +```js |
| 77 | +inventory.reduce( |
| 78 | + (result, { category, name, quantity }) => ( |
| 79 | + (result[category] ??= {}), |
| 80 | + (result[category][name] = ~~result[category][name] + quantity), |
| 81 | + result |
| 82 | + ), |
| 83 | + {}, |
| 84 | +); |
| 85 | +``` |
| 86 | +
|
| 87 | +Dentro de la función de reducción, desestructuramos cada objeto en sus propiedades `category`, `name` y `quantity`. Luego, actualizamos el objeto `result` con la información del juguete actual. |
| 88 | +
|
| 89 | +```js |
| 90 | +(result[category] ??= {}), |
| 91 | +(result[category][name] = ~~result[category][name] + quantity), |
| 92 | +result |
| 93 | +``` |
| 94 | +
|
| 95 | +Para organizar el inventario, primero verificamos si la categoría ya existe en el objeto `result`. Si no existe, la inicializamos como un objeto vacío. |
| 96 | +
|
| 97 | +```js |
| 98 | +(result[category] ??= {}) |
| 99 | +``` |
| 100 | +
|
| 101 | +Luego, actualizamos la cantidad del juguete en la categoría correspondiente. Para ello, sumamos la cantidad actual del juguete con la cantidad del juguete actual. |
| 102 | +
|
| 103 | +Para evitar problemas con valores `undefined`, utilizamos el operador de doble negación `~~` para convertir `undefined` en `0` y sumar la cantidad actual. |
| 104 | +
|
| 105 | +Para saber más sobre el operador de doble negación, puedes consultar la siguiente [documentación](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_NOT). |
| 106 | +
|
| 107 | +```js |
| 108 | +(result[category][name] = ~~result[category][name] + quantity) |
| 109 | +``` |
| 110 | +
|
| 111 | +Finalmente, devolvemos el objeto `result` actualizado en cada iteración. |
| 112 | +
|
| 113 | +```js |
| 114 | +result |
| 115 | +``` |
0 commit comments