es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Contar el número total de llaves de objetos y arrays anidados.

Tengo un objeto anidado con diferentes tipos de propiedades, incluyendo cadena, objeto y arreglo. Utilicé el enfoque recursivo para contar el número total de claves (desde key1 hasta key9) en el objeto, pero no logré obtener la solución correcta. A continuación tienes un ejemplo de mi código.

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);
      }
      // esta línea es problemática ya que cuenta cada objeto en el arreglo como una clave. 
      if (!Array.isArray(value)) count++;
    }
  }
  helper(data)
  return count;
}
console.log(countKeys(data)) // 10, la respuesta correcta es 9

He intentado entenderlo durante muchas horas pero no puedo encontrar la solución. ¿Alguien puede explicarme qué me falta aquí y qué debería agregar para que funcione correctamente?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con la implementación actual es que cuenta los arrays como objetos, lo que lleva a contar 1 adicional por cada array. Para solucionarlo, necesitamos verificar los arrays por separado y solo contar sus claves si son objetos. Aquí tienes una implementación actualizada:

    const countKeys = (data) => {
      let count = 0;
    
      const helper = (data) => {
        for (let key in data) {
          if (typeof data[key] === 'object' && !Array.isArray(data[key])) {
            count++;
            helper(data[key]);
          } else if (Array.isArray(data[key])) {
            for (let item of data[key]) {
              if (typeof item === 'object') {
                helper(item);
              }
            }
          } else {
            count++;
          }
        }
      };
    
      helper(data);
      return count;
    };
    
    console.log(countKeys(data)); // 9
    

    En esta implementación, primero verificamos si el valor actual es un objeto y no un array, lo contamos y luego llamamos a la función auxiliar de forma recursiva. Si es un array, iteramos a través del array y verificamos cada elemento. Si es un objeto, llamamos a la función auxiliar recursivamente. De lo contrario, lo contamos como una clave. Esta implementación proporciona el recuento correcto de 9 para el objeto de datos dado.

Comments are closed.