Tengo estos objetos anidados
var obj = { first:{ num:10 }, second: { num:5 }, third: { num: 15 } } console.log(obj); entonces podría haber muchos objetos anidados dentro y necesito obtener el objeto con el valor num más alto dentro del cual en este caso es el third objeto.
Entonces debería obtener como salida
third: { num: 15 }Me quedé atascado en la iteración.
var arr = Object.keys( obj ).map(function ( key, index ) { console.log(obj[key]); }); console.log(arr);como mencioné en mi comentario anterior, lo que mencionó como resultado esperado no es realmente un objeto. sin embargo, puede usar el siguiente fragmento para encontrar la clave dentro de su objeto principal que contiene el número más alto:
var running = Number.MIN_VALUE; var ans = ""; Object.keys(object).forEach(key => { if(object[key]["num"] > running) { ans = key; } }) console.log(JSON.stringify(object[ans])); //outputs { num: 15 }Si desea recuperar todo el objeto con el valor alto, usaría reduce
var obj = { first:{ num:10 }, second: { num:5 }, third: { num: 15 } } const result = Object.entries(obj) .reduce( (acc,[k,i]) => Object.values(acc)[0].num<i.num ? {[k]:i} : acc , {zero:{num:0}}) console.log(result);No hay necesidad de Object.keys (aunque eso estaría bien para obtener una matriz de claves de objetos para verificar) o map , solo un ciclo simple donde recuerda el objeto con el número más alto que ha visto hasta ahora:
let found = null; // Loop through the keys of the object for (const key in obj) { // Get the value for this key const entry = obj[key]; // If this is an own property of the object and either A) We // don't have any "found" object yet or the one we do have has // a lower `num` than this one, remember this one if (Object.hasOwn(obj, key) && (!found || found.num < entry.num)) { found = entry; } }Ejemplo en vivo:
const obj = { first:{ num:10 }, second: { num:5 }, third: { num: 15 } }; let found = null; for (const key in obj) { const entry = obj[key]; if (Object.hasOwn(obj, key) && (!found || found.num < entry.num)) { found = entry; } } console.log(found); Si también necesita recordar el nombre de la propiedad, simplemente hágalo al mismo tiempo que asigna a found .
Eso usa la nueva función Object.hasOwn . Si necesita admitir implementaciones que no lo tienen, use un polyfill seleccionado o simplemente:
if (!Object.hasOwn) { Object.defineProperty(Object, "hasOwn", { value: Function.prototype.call.bind(Object.prototype.hasOwnProperty), writable: true, configurable: true, }); }