如何在 javascript 中打印对象迭代子对象?

How do I print an objects iterated children in javascript?

我有对象:

[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}

我想在我这样做之前将所有这些都放入一个数组中,尽管我只是简单地尝试打印它们,但我什至似乎无法做到这一点。这是我的代码:

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\'"));
}

对于输出你得到:

"MTH 1100-A"
未定义
未定义
未定义
未定义

那么为什么我不能得到那些值......?

您的代码存在一些问题。

  1. 您打印的行属于第一个 console.log() 调用。在那里你传递'0.Class',你不会在 for 循环内的 console.log() 调用中这样做。在那里这应该足够 getDescendantProp(obj, i + ".Class")。无需转义引号。
  2. 你在 while 循环中的条件对我来说似乎很奇怪。通过使用 = 运算符,您将表达式的右侧分配给 obj,从而将 obj 的原始值替换为 obj[arr.shift()]。如果 obj[arr.shift()] 恰好不为空,这发生在 while 循环的第一次迭代中,并且条件通过。那么你的 return obj 就变成了你要找的值。我不得不说,我发现这是一种找到您正在寻找的对象 属性 的巧妙方法,但有点过度设计。对于比较,您应该使用 == 或 ===。

我稍微修改了您的代码使其可以正常工作,并添加了一些变量以便能够跟踪正在发生的事情:

    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);
    }

但是,请注意您可以像这样 obj.property 或 obj["property"] 访问对象属性。考虑到这一点,这可以进一步简化为以下内容:

    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
    }

干杯

对象没有 length 属性。所以你正在循环遍历未定义的值。

您可以使用 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);
});

我找到了我的答案,一个我不明白的小语法错误,但问题是:

之前

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

之后

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