Javascript key()从集合中返回MongoDB对象上的意外键
处理一个奇怪的问题。这是一个从mongodb提取并传递到以下函数的对象数组 我在从数据库提取的数组上的Javascript key()从集合中返回MongoDB对象上的意外键,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,处理一个奇怪的问题。这是一个从mongodb提取并传递到以下函数的对象数组 我在从数据库提取的数组上的forEach中按顺序尝试了以下3个日志: e(数组中的对象元素),该元素正确返回。如您所见,所有属性(键)都存在: console.log(Object.keys(e))返回的东西不是键 最后: 返回绝对混乱的数据,其中一部分包含对象的实际键: __parentArray __parent __index $__ isNew errors _doc $init id _id hot
forEach
中按顺序尝试了以下3个日志:
(数组中的对象元素),该元素正确返回。如您所见,所有属性(键)都存在:e
返回的东西不是键console.log(Object.keys(e))
- 最后:
__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中的键)
有人能帮我把这件事弄清楚吗 迭代所有可枚举属性,包括自有属性和继承属性。这不是“一个奇怪的错误”,这实际上是预期的行为
至于Object.keys()
,除非它被不兼容的实现覆盖,否则这些实际上是对象本身的可枚举键,所以您很可能弄错了。e
对象在其原型中有一个方法,当您执行console.log(e)
时,该方法会被隐式调用,因此这可能就是您在那里看到的输出,并且不可能反映与原始对象完全相同的属性键。尝试调用console.log(e.toJSON())
,我猜它的输出将与第一个相同
如果只需要对象自己的属性,请使用
如果希望在第一次输出中打印键,请使用
Object.keys(e.toJSON())
Object.keys
记录对象的键。它就是这样做的。它“不起作用”的唯一方式是如果其他东西覆盖了本机实现。你包括任何polyfill库吗?我就是这么想的。我以前使用过Object.keys(),效果很好。我甚至不知道polyfill库是什么,所以我想我的答案是否定的,除非它自动包含在节点中。这是一个节点应用程序,查询数据库,然后对数据执行操作。啊,好的,我想我现在明白了。问题实际上是console.log没有标准化。当您记录对象时,console.log
的节点版本可能会截断它认为相关的键。Object.keys
的输出实际上是该对象的键的真实列表。如果你编辑这个问题,我会删除DV:),但这不是因为我不能对密钥做任何事情。我的目标是获取键,修改键名并将它们分配给以前的键值,然后将其传递到其他一些函数中。但是它失败了,因为它无法访问keysi need keyName+i,其中“i”是数组中元素的索引。所以我的目标是:获取当前的键对象。键(E)修改它们[EKE+II] = E[KE]删除旧的键,删除E[KEY],然后执行ActoNi不考虑对<代码>的隐式调用。tojSon()/<代码>必须是奇数。该方法用于将对象预处理为适合序列化的格式,因此很有意义。我以前从未使用过object.keys(obj.toJSON())我总是能够只使用object.keys(obj)。我仍然不明白为什么会是这样,但我会接受它是有效的。例如JSON.stringify()
在序列化过程中将对象的.toJSON()
视为替换函数。谢谢您提供的信息。这在记录密钥方面是有效的,但它不允许我对密钥做任何事情。当我尝试更新密钥时,什么都没有发生。我放弃了,伙计。问题不在于Object.keys(),而在于Mongoose返回的对象的格式。看见
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);
}
}
....