参见英文答案 >
mongoose .find() method returns object with unwanted properties2个
在这里处理一个奇怪的问题.这是一个从mongodb中提取并传递给以下函数的对象数组.
在这里处理一个奇怪的问题.这是一个从mongodb中提取并传递给以下函数的对象数组.
我在从数据库中提取的数组上的forEach中依次尝试了以下3个日志:
> e(数组中的对象元素)正确返回.如您所见,所有属性(键)都存在:
{ paid: false,hotelWebsite: 'www.testing.com',_id:5951848a24bb261eed09d638,hotelAddress: '123 easy street',...etc }
> 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(obj中的键).
任何人都可以帮我解决这个问题吗?
解决方法
for ... in
迭代所有可枚举的属性,包括自己的和继承的.这不是“一个奇怪的错误”,这实际上是预期的行为.
至于Object.keys(),除非被不合规的实现覆盖,否则这些实际上是对象本身的可枚举键,所以你很可能会弄错. e对象在其原型中有一个.toJSON()
方法,当你执行console.log(e)时会隐式调用它,因此这可能是你在那里看到的输出,并且不太可能反映与原始属性完全相同的属性键.宾语.尝试调用console.log(e.toJSON()),我猜它将与第一个输出相同.
如果只想要对象自己的属性,请使用Object.getOwnPropertyNames(e)
.
如果要在第一个输出中打印键,则使用Object.keys(e.toJSON()).