Tengo una matriz con más de 50 entradas en forma de objetos, que me gustaría guardar según el ID del elemento para poder aplicarles ciertos cálculos. Por ejemplo, me gustaría sumar la hora de todas las entradas con el Id. de artículo "Las5241Wz".
Dado que la matriz puede cambiar dinámicamente, no puedo analizarla manualmente. ¿Cómo puedo separar los datos de antemano de acuerdo con su ID de elemento y colocarlos en nuevas matrices? El Array real contiene hasta 16 objetos con la misma ID.
var data= [] data = [ //...objects { itemId: "Las5241Wz", time: 10 }, { itemId:"Bos1239Zf", time: 11 }, { itemId:"Las5241Wz", time: 15 }, { itemId:"Bos1239Zf", time: 21 } //...more objets ]La solución para esto debería verse así:
var Item1 = [ { itemId: "Las5241Wz", time: 10 }, { itemId:"Las5241Wz", time: 15 }, ] var Item2 = [ { itemId:"Bos1239Zf", time: 11 }, { itemId:"Bos1239Zf", time: 21 } ]A menos que tenga una razón de rendimiento para mantener las listas por separado, la respuesta es que puede almacenar la lista de ID como un Set y usar array.filter cuando desee obtener la lista que es solo para esa ID.
Set s = new Set(); for (let i = 0; i < data.length; i++) { s.add(data[i].itemId); } var createFilterFunc(id) { return function(elem) { return elem.itemId == id; } } var items = data.filter (createFilterFunc("Las5241Wz"));Aquí hay otra solución que crea un objeto con las propiedades "elemento1", "elemento2" y así sucesivamente a partir del objeto dado:
const data = [ //...objects { itemId: "Las5241Wz", time: 10 }, { itemId:"Bos1239Zf", time: 11 }, { itemId:"Las5241Wz", time: 15 }, { itemId:"Bos1239Zf", time: 21 } //...more objets ] console.log( Object.values( data.reduce((o,e)=>((o[e.itemId]=o[e.itemId]||[]).push(e),o),{})) .reduce((o,c,i)=>(o["item"+(i+1)]=c,o),{}) );Esta es una "una sola línea" y por esa razón no es tan fácil de leer. Entonces, probablemente no sea la versión que pondrías en tu código de producción.