Tengo una lista de elementos como se ve a continuación. Los valores para la clave de cada año son una lista de 10 elementos, pero para abreviar, solo muestro los primeros dos. ¿Cómo puedo encontrar el máximo de todos los valores internos de "recuento"? He analizado varios enfoques, pero ninguno ha funcionado hasta ahora y tal vez me esté perdiendo algo aquí. Por ejemplo, me gustan mucho algunos de los de una sola línea aquí, pero no funcionaron para mí . Ingrese la descripción del enlace aquí.
Solo para aclarar que los datos son el resultado de un anidamiento en el archivo csv y están destinados a ser utilizados en el gráfico d3 y, preferiblemente, no en la biblioteca de importación que no sean las estándar.
data = [ {'2015': values: [{key: '0', value: {count: 45}},{key: '1', value: {count: 3}}, ... ]}, {'2016': values: [{key: '0', value: {count: 67}},{key: '1', value: {count: 0}}, ... ]}, {'2017': values: [{key: '0', value: {count: 12}},{key: '1', value: {count: 8}}, ... ]} ]Para mostrar mejor cómo se ven los datos, aquí está la captura de pantalla en caso de que ayude a aclarar la pregunta.
Podría desestructurar el objeto de esta manera aplanando la matriz de valores y luego mapeando para obtener la variable de conteo.
var data = [ {"key":"2015", "values": [{"key": 0, "value": {"count": 45}},{"key": 1, "value": {"count": 3}}]},{"key":"2016", "values": [{"key": 0, "value": {"count": 67}},{"key": 1, "value": {"count": 0}}]},{"key": "2017", "values": [{"key": 0, "value": {"count": 12}},{"key": 1, "value": {"count": 8}}]} ] var num = Math.max(... data.map(d=>d.values).flat().map(v=>v.value.count)) console.log(num)Algo como esto debería funcionar
const myData = [ { key: "2015", values: [10, 5, 4, 3, 2, 1, 0] }, { key: "2015", values: [10, 5, 4, 3, 2, 1, 0] }, { key: "2015", values: [10, 5, 4, 3, 2, 1, 0] }, { key: "2015", values: [100, 5, 4, 3, 2, 1, 0] }, { key: "2015", values: [10, 5, 4, 3, 2, 1, 0] }, ] const maxValue = (data) => { // Setting an initial value to the lowest possible value in Javascript let max = Number.MIN_VALUE; // Iterate over each object in your array of data data.forEach(({values}) => { // Destructure the values from each object and then iterate over those values.forEach(value => { // Set the max to the higher over the current max or current value max = Math.max(max, value); }) }) // Return the max return max; } console.log(maxValue(myData))Lo que estamos haciendo aquí es iterar sobre cada objeto en la matriz inicial. Luego iterando sobre los valores haciendo un seguimiento de un máximo actual.
Su estructura de datos parece ser incorrecta. No puede tener { '2015': values: [...] } . Esto sería el equivalente de { KEY: VALUE: VALUE} . El navegador parece estar infiriendo el significado de su código y creando un objeto a partir de él de todos modos, pero no es correcto.
Puede hacer un objeto de objetos y tener objetos internos nombrados, como este:
data = { 2015: { values: [ { key: "0", value: { count: 45 } }, { key: "1", value: { count: 3 } }, ], }, 2016: { values: [ { key: "0", value: { count: 67 } }, { key: "1", value: { count: 0 } }, ], }, 2017: { values: [ { key: "0", value: { count: 12 } }, { key: "1", value: { count: 8 } }, ], }, };O puede crear una matriz de objetos, como esta:
data = [ { year: 2015, values: [ { key: "0", value: { count: 45 } }, { key: "1", value: { count: 3 } }, ], }, { year: 2016, values: [ { key: "0", value: { count: 67 } }, { key: "1", value: { count: 0 } }, ], }, { year: 2017, values: [ { key: "0", value: { count: 12 } }, { key: "1", value: { count: 8 } }, ], }, ]; La forma en que obtiene la propiedad de count más alto depende de la estructura de datos que use.
Usando la matriz de objetos, abordaría el problema de esta manera:
// create a temp storage array to store "count" property of each const countArray = []; // iterate through the outer objects for (const outerObject of data) { // iterate through the objects that are in the "values" array for (const innerObject of outerObject.values) { // push the "count" value to the array countArray.push(innerObject.value.count) } } // sort the array in place, with highest values first countArray.sort((a, b) => b - a); // display the result console.log(countArray[0])Podría hacer algo similar para la estructura de datos de objeto de objetos, pero necesitaría una sintaxis diferente para eso.