在这里处理一个奇怪的问题。这是从mongodb中提取并传递给以下函数的对象数组。
我在forEach从数据库中拉出的阵列中依次尝试了以下3个日志:
forEach
e(数组中的object元素)可以正确返回。如您所见,所有属性(键)都存在:
e
{ paid: false, hotelWebsite: 'www.testing.com’, _id:5951848a24bb261eed09d638, hotelAddress: ‘123 easy street’, …etc }
console.log(Object.keys(e)) 返回不是关键的东西…
console.log(Object.keys(e))
[ ‘parentArray’, ‘__parent’, ‘__index’, ‘$’, ‘isNew’, ‘errors’, ‘_doc’, ‘$init’ ]
最后:
for(key in e){ console.log(key); }
它返回绝对的数据混乱,其中的一部分包含对象的实际键:
__parentArray __parent __index $__ isNew errors _doc $init id _id hotelWebsite hotelAddress hotelNumber hotelName courseCost courseDate courseState courseCity courseName paid studentComments studentEmail studentPhone studentCountry studentZip studentState studentCity studentAddress studentCompany studentName schema constructor $__original_remove remove _pres _posts $__original_validate validate toBSON markModified populate save update inspect invalidate $markValid $isValid ownerDocument $__fullPath parent parentArray on once emit listeners removeListener setMaxListeners removeAllListeners addListener $__buildDoc init $hook $pre $post removePre removePost _lazySetupHooks set $__shouldModify $__set getValue setValue get $__path unmarkModified $ignore modifiedPaths isModified $isDefault isDirectModified isInit isSelected isDirectSelected $__validate validateSync $__reset $__dirty $__setSchema $__getArrayPathsToValidate $__getAllSubdocs $__handleReject $toObject toObject toJSON toString equals execPopulate populated depopulate
以及相关代码示例(如果需要):
studentsArray.forEach( (e, i) => { if(task === 'nameTag'){ console.log(e); console.log(Object.keys(e)); for(k in e){ console.log(k); } } ....
我需要访问属性(键)以在forEach函数中进行进一步处理。我对造成这种情况的原因非常困惑,并且从未遇到过此类问题。为了记录该对象存在,使用console.log(typeof e)它是一个对象(不是数据“字符串”)。我可以使用点或括号符号访问属性,但不能使用Object.keys()或for (keys in obj)。
console.log(typeof e)
Object.keys()
for (keys in obj)
谁能帮我解决这个问题?
for ... in迭代所有拥有和 继承的 可枚举 属性。这不是“奇怪的错误”,实际上这是预期的行为。 __
for ... in
至于Object.keys(),除非它被不兼容的实现覆盖,否则实际上它们是对象本身的可枚举键,因此您很可能会弄错。该e对象.toJSON()在其原型中有一个方法,当您执行此操作时会隐式调用该方法console.log(e),因此该方法可能是您在此处看到的输出,并且不太可能反映出与原始对象完全相同的属性键。尝试调用console.log(e.toJSON()),我想它将与第一个输出相同。
.toJSON()
console.log(e)
console.log(e.toJSON())
如果只需要对象自身的属性,请使用Object.getOwnPropertyNames(e)。
Object.getOwnPropertyNames(e)
如果要在第一个输出中打印键,请使用Object.keys(e.toJSON())。
Object.keys(e.toJSON())