¿Cómo imprimo objetos iterados de niños en javascript?

¿Cómo imprimo objetos iterados de niños en javascript?

Tengo Objeto:

[Object]
    0: {Class: "MTH 1100-A", __rowNum__: 1}
    1: {Class: "CSC 3200-B", __rowNum__: 2}
    2: {Class: "ART 4334-E", __rowNum__: 3}
    3: {Class: "REC 3223-C", __rowNum__: 4}

Me gustaría tener todo esto en una matriz, antes de hacerlo, aunque simplemente estaba tratando de imprimirlo y parece que ni siquiera puedo hacerlo. Aquí está el código que tengo:

const obj = {
  0: { Class: "MTH 1100-A",__rowNum__: 1},
  1: { Class: "CSC 3200-B", __rowNum__: 2 },
  2: { Class: "ART 4334-E", _rowNum__: 3 } ,
  3: { Class: "REC 3223-C", _rowNum__: 4 }
};

function getDescendantProp(obj, desc) {
  var arr = desc.split(".");
  while (arr.length && (obj = obj[arr.shift()]));
  return obj;
}

console.log(getDescendantProp(obj, '0.Class'));

for (var i = 0; i < obj.length; i++) {
  console.log(getDescendantProp(obj, "\'" + i + ".Class\'"));
}

Para la salida obtienes:

"MTH 1100-A"
Indefinido
Indefinido
Indefinido
indefinido

Entonces, ¿por qué no puedo obtener esos valores...?

Mostrar la mejor respuesta

Hay algunos problemas con su código.

  1. La línea que viste pertenece a la primera llamada a console.log(). Allí pasas '0.Class', lo que no haces en las llamadas de console.log() dentro del bucle for. Allí esto debería ser suficiente getDescendantProp(obj, i + ".Class"). No es necesario escapar de las comillas.
  2. Tu condición en tu bucle while me parece muy extraña. Al usar el operador =, está asignando el lado derecho de la expresión a obj, reemplazando así el valor original de obj por obj[arr.shift()]. Si obj[arr.shift()] no es nulo, lo que sucede en la primera iteración del ciclo while, y la condición se cumple. Luego devuelve obj, que se ha convertido en el valor que estaba buscando. Debo decir que me parece una forma ingeniosa de encontrar la propiedad del objeto que está buscando, pero un poco sobrediseñada. Para las comparaciones, debe usar == o ===.

Modifiqué un poco tu código para que funcione y agregué algunas variables para poder rastrear lo que está pasando:

    var obj = {
        0: {Class: "MTH 1100-A", __rowNum__: 1},
        1: {Class: "CSC 3200-B", __rowNum__: 2},
        2: {Class: "ART 4334-E", __rowNum__: 3},
        3: {Class: "REC 3223-C", __rowNum__: 4}
    }

    function getDescendantProp(obj, desc) {
        var arr = desc.split(".");
        var arrCopy = arr.slice();
        arrCopy = arrCopy.shift();
        while(arr.length && (obj = obj[arr.shift()])){
            var bla = "bla";
        };
        return obj;
    }

    for(var i = 0; i< Object.keys(obj).length; i++) {
        var o = getDescendantProp(obj,  i + ".Class");
        console.log(o);
    }

Sin embargo, tenga en cuenta que puede acceder a las propiedades de un objeto como este obj.property u obj["property"]. Con esto en mente, esto se puede simplificar aún más a lo siguiente:

    var descendantsArray = [];          // Array to put each desired element from obj
    var objKeys = Object.keys(obj);     // Array with the keys to the object

    for (var i = 0; i < objKeys.length; i++) {
        var currentKey = objKeys[i];                    // Get current key
        var currentElement = obj[currentKey];           // Get the element that corresponds to the key
        descendantsArray.push(currentElement.Class);    // Add the current element's Class property to the Array
        console.log(currentElement.Class);              // Print the 'Class' property of the current element
    }

Saludos

El objeto NO tiene la propiedad length. Entonces estás recorriendo un valor indefinido.

Puede convertir su objeto en una matriz con Object.values(obj):

const obj = {
  0: { Class: "MTH 1100-A",__rowNum__: 1},
  1: { Class: "CSC 3200-B", __rowNum__: 2 },
  2: { Class: "ART 4334-E", _rowNum__: 3 } ,
  3: { Class: "REC 3223-C", _rowNum__: 4 }
};

function getDescendantProp(obj, key) {
  return Object.values(obj).map(i => i[key]);
}

console.log(getDescendantProp(obj, 'Class'));

const arr = getDescendantProp(obj, 'Class');
arr.forEach(i => {
  console.log(i);
});

Encontré mi respuesta, un pequeño error de sintaxis que no entiendo pero aquí estaba el problema:

ANTES

for (var i = 0; i < obj.length; i++) {
  console.log(getDescendantProp(obj, "\'" + i + ".Class\'"));
}

DESPUÉS

for (var i = 0; i < obj.length; i++) {
  console.log(getDescendantProp(obj, i+`.Class`));
}