Tengo un objeto anidado con diferentes tipos de propiedades que incluyen cadena, objeto y matriz. Utilicé el enfoque recursivo para contar el número total de claves (de key1 a key9) en el objeto, pero no pude lograr la solución correcta. Ejemplo de mi código a continuación.
const data = { key1: '1', key2: '2', key3: { key4: '4' }, key5: [ { key6: '6', key7: '7', }, { key8: '8', key9: '9', } ] } const countKeys = (data) => { let count = 0; const helper = (data) => { for (let value of Object.values(data)) { if (typeof value === 'object') { helper(value); } // this line is problematic as it counts each object in the array as key. if (!Array.isArray(value)) count++; } } helper(data) return count; } console.log(countKeys(data)) // 10, correct answer is 9Intento entenderlo durante muchas horas, pero no pude obtener la solución. ¿Alguien puede explicarme lo que me estoy perdiendo aquí y se supone que debo agregar para que funcione?
Para los datos proporcionados, existen nueve (9) claves. Podría usar un countKeys(t) recursivo y hacer un análisis de tipo en el tipo de t :
v en Object.values(t) , reduzca y cuente uno más el resultado recursivo, countKeys(v)v en t , suma countKeys(v)t no es ni un objeto ni una matriz, devuelve cero function countKeys(t) { switch (t?.constructor) { case Object: // 1 return Object .values(t) .reduce((r, v) => r + 1 + countKeys(v), 0) case Array: // 2 return t .reduce((r, v) => r + countKeys(v), 0) default: // 3 return 0 } } const data = {key1:"1",key2:"2",key3:{key4:"4"},key5:[{key6:"6",key7:"7"},{key8:"8",key9:"9"}]} console.log(countKeys(data))