¡Estoy tratando de calcular un resultado de una matriz para objetos que puedo contar cuántos valores para cada clave y agregar su propio dbId al mismo resultado calculado dentro del nombre del objeto! la razón detrás de eso es usarlo para chart.js. para que pueda verificar que cada valor de resultado viene con sus propios dbIds
const obj = [ { dbId: 26598, properties: [ { attributeName: "BIM7AATypeCode" }, { displayCategory: "Identity Data" }, { displayName: "BIM7AATypeCode" }, { displayValue: "221" }, ], }, { dbId: 26591, properties: [ { attributeName: "BIM7AATypeCode" }, { displayCategory: "Identity Data" }, { displayName: "BIM7AATypeCode" }, { displayValue: "221" }, ], }, { dbId: 3695, properties: [ { attributeName: "abc" }, { displayCategory: "Identity Data" }, { displayName: "BIM7AATypeCode" }, { displayValue: "123" }, ], }, { dbId: 3697, properties: [ { attributeName: "abc" }, { displayCategory: "Identity Data" }, { displayName: "BIM7AATypeCode" }, { displayValue: "123" }, ], }, ]; // type Histogram = { // [key: string]: number; // }; let histogram = {}; //as Histogram for (let iterator of obj) { for (let { displayName, displayValue } of iterator.properties) { //@ts-ignore histogram[displayName] = histogram[displayName] | {}; if (!histogram[displayValue]) { histogram[displayValue] = 1; } else { histogram[displayValue] = histogram[displayValue] + 1; } } } console.log(histogram); //expected result: /* { BIM7AATypeCode: { "221": 2, dbid: [26598, 26591], }, abc: { "123": 2, dbid: [3695, 3697], }, }; */Encuentre la implementación de Array.reduce .
Lógica
obj usando Array.reduceproperties . A partir de este nodo, seleccione el nombre del attributeName clave, que es el nodo de atributo, y el valor de displayValue , que es el nodo de valor de visualización.attributeName .displayValue teniendo el valor 1 y dbid como una matriz de un solo nodo.displayValue y presione el nuevo dbid const obj = [ { dbId: 26598, properties: [{ attributeName: "BIM7AATypeCode" }, { displayCategory: "Identity Data" }, { displayName: "BIM7AATypeCode" }, { displayValue: "221" }] }, { dbId: 26591, properties: [{ attributeName: "BIM7AATypeCode" }, { displayCategory: "Identity Data" }, { displayName: "BIM7AATypeCode" }, { displayValue: "221" }] }, { dbId: 3695, properties: [{ attributeName: "abc" }, { displayCategory: "Identity Data" }, { displayName: "BIM7AATypeCode" }, { displayValue: "123" }] }, { dbId: 3697, properties: [{ attributeName: "abc" }, { displayCategory: "Identity Data" }, { displayName: "BIM7AATypeCode" }, { displayValue: "123" }] }, ]; const output = obj.reduce((acc, curr) => { const attribute = curr.properties.find(node => node.attributeName); const displayValue = curr.properties.find(node => node.displayValue); if (acc[attribute.attributeName]) { acc[attribute.attributeName][displayValue.displayValue] ? acc[attribute.attributeName][displayValue.displayValue]++ : acc[attribute.attributeName][displayValue.displayValue] = 1; acc[attribute.attributeName].dbid.push(curr.dbId); } else { const newAttribute = { [displayValue.displayValue]: 1, dbid: [curr.dbId] } acc[attribute.attributeName] = newAttribute; } return acc; }, {}); console.log(output);