Digamos que tengo algunos datos organizados así...
dataArr = [ {service: s1, status: ready}, {service: s2, status: ready}, {service: s1, status: retired}, {service: s3, status: retired}, {service: s2, status: ready} ]Hay 3 servicios distintos. Cada elemento de datos tiene uno de los tres tipos de servicio y tiene un estado de retirado o listo.
¿Cómo puedo recorrer cada elemento en dataArr para crear el siguiente statusByServiceObj? Por ejemplo, dentro de todos los datos, quiero encontrar todos los tipos de servicio s1 y luego determinar cuántos s1 están en estado retirado o listo.
statusByServiceObj = { {s1: {ready: 1, retired: 1} }, {s2: {ready: 2, retired: 0} }, {s3: {ready: 0, retired: 1} }, }Donde estoy actualmente, he recorrido la matriz dataArr para crear un objeto como este:
let obj = {}; let nestedObj = {}; dataArr.forEach(ele => { obj[ele.service] = nestedObj; nestedObj[ele.status] = 0; }); // obj now equals... obj = { {s1: {ready: 0, retired: 0} }, {s2: {ready: 0, retired: 0} }, {s3: {ready: 0, retired: 0} }, }Tengo dificultades para completar los recuentos listos y retirados según el tipo de servicio, al recorrer mi dataArr.
Muy abierto a recomendaciones de mejores prácticas, nuevo en JS. Siento que me estoy volviendo loco al aplicar el valor 0 ... debería ser una especie de conteo. O posiblemente convertir el Objeto de Objetos en una Matriz de Objetos...
Intenté contar los valores de estado por servicios de esta manera:
dataArr.forEach(ele => { for (let service in obj) { let countsObj = obj[service]; for (let status in countsObj) { if (ele.service === service && ele.status === status) { countsObj[status = countsObj[status] + 1; } } } }Sin embargo, esto regresa a obj que obtiene los recuentos totales de cada estado en todo el dataArr, listo o retirado, y lo aplica a cada objeto de servicio:
obj = { {s1: {ready: 3, retired: 2} }, {s2: {ready: 3, retired: 2} }, {s3: {ready: 3, retired: 2} }, }Puede usar reducir para lograr el resultado deseado
const dataArr = [ { service: "s1", status: "ready" }, { service: "s2", status: "ready" }, { service: "s1", status: "retired" }, { service: "s3", status: "retired" }, { service: "s2", status: "ready" }, ]; const result = dataArr.reduce((acc, curr) => { const { service, status } = curr; if (!acc[service]) acc[service] = { ready: 0, retired: 0 }; acc[service][status] += 1; return acc; }, {}); console.log(result); /* This is not a part of answer. It is just to give the output fill height. So IGNORE IT */ .as-console-wrapper { max-height: 100% !important; top: 0; }