如何在 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"
未定义
未定义
未定义
未定义
那么为什么我不能得到那些值......?
您的代码存在一些问题。
- 您打印的行属于第一个 console.log() 调用。在那里你传递'0.Class',你不会在 for 循环内的 console.log() 调用中这样做。在那里这应该足够
getDescendantProp(obj, i + ".Class")
。无需转义引号。
- 你在 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`));
}
我有对象:
[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"
未定义
未定义
未定义
未定义
那么为什么我不能得到那些值......?
您的代码存在一些问题。
- 您打印的行属于第一个 console.log() 调用。在那里你传递'0.Class',你不会在 for 循环内的 console.log() 调用中这样做。在那里这应该足够
getDescendantProp(obj, i + ".Class")
。无需转义引号。 - 你在 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`));
}