Javascript Object.hasOwnProperty具有多个级别,没有错误
我想知道是否有某种方法可以将hasOwnProperty用于多个级别的对象 举例说明: 我有以下目标:Javascript Object.hasOwnProperty具有多个级别,没有错误,javascript,hasownproperty,Javascript,Hasownproperty,我想知道是否有某种方法可以将hasOwnProperty用于多个级别的对象 举例说明: 我有以下目标: var Client = { ID: 1, Details: { Title: 'Dr', Sex: 'male' } } 现在,我可以在javascript中执行以下操作: ('Title' in Client.Details) -> true 但是我不能!做: ('Street' in Client.Adress) …但我
var Client = {
ID: 1,
Details: {
Title: 'Dr',
Sex: 'male'
}
}
现在,我可以在javascript中执行以下操作:
('Title' in Client.Details) -> true
但是我不能!做:
('Street' in Client.Adress)
…但我必须首先使用if,以避免抛出错误。因为我可能有一个大对象-我只需要知道客户端中是否有“地址”。详细信息,而不使用先前的if语句,是否知道这是可能的
// this is overkill -> (will be many more if-statements for checking a lower level
if('Adress' in Client){
console.log('Street' in Client.Adress)
} else {
console.log(false)
}
产生错误的示例:
var客户端={
ID:1,
详情:{
标题:'博士',
性别:'男'
}
}
//错误结果:
(“客户地址”中的“街道”)
//错误结果:
如果Client.address中的('Street'){}
可以通过字符串传递属性路径,并使用递归函数向下运行对象:
const checkPath = (o, path) => {
if(path.includes('.')){
if(o.hasOwnProperty(path.split('.')[0])) return checkPath(o[path.split('.')[0]], path.split('.').slice(1).join('.'));
else return false
}else return o.hasOwnProperty(path);
}
然后像这样使用它:
checkPath(Client, 'Details.Title')
演示:
让客户端={
ID:1,
详情:{
标题:'博士',
性别:'男'
}
};
常量检查路径=(o,路径)=>{
if(路径包括('.')){
if(o.hasOwnProperty(path.split('.')[0])返回checkPath(o[path.split('.')[0]),path.split('.').slice(1.join('.'));
否则返回false
}否则返回o.hasOwnProperty(路径);
}
log(检查路径(客户端,'Details.Title');
log(检查路径(客户端,'Test.Title')
您可以通过字符串传递属性路径,并使用递归函数向下运行对象:
const checkPath = (o, path) => {
if(path.includes('.')){
if(o.hasOwnProperty(path.split('.')[0])) return checkPath(o[path.split('.')[0]], path.split('.').slice(1).join('.'));
else return false
}else return o.hasOwnProperty(path);
}
然后像这样使用它:
checkPath(Client, 'Details.Title')
演示:
让客户端={
ID:1,
详情:{
标题:'博士',
性别:'男'
}
};
常量检查路径=(o,路径)=>{
if(路径包括('.')){
if(o.hasOwnProperty(path.split('.')[0])返回checkPath(o[path.split('.')[0]),path.split('.').slice(1.join('.'));
否则返回false
}否则返回o.hasOwnProperty(路径);
}
log(检查路径(客户端,'Details.Title');
log(检查路径(客户端,'Test.Title')代码>console.log('address'在Client中&'Street'在Client.address中)
?我为您添加了一个示例,说明存在错误是的,我看到有错误。但是不,检查您正在访问的每个属性并不过分,不,您不需要更多的if
语句。用10+个级别成像一个对象,我只想知道在7级是否存在对象“XYZ”。这意味着6(我认为)if语句只是为了不让代码在错误中崩溃,这在我看来是过分了no,而不是if
语句!只需使用&
操作符将它们链接在一起即可。您可以将该表达式置于单个if
条件中。有关替代方法,请参见重复的console.log('address'在客户端和'Street'在客户端.address)
?我为您添加了一个示例,说明存在错误是的,我看到有错误。但是不,检查您正在访问的每个属性并不过分,不,您不需要更多的if
语句。用10+个级别成像一个对象,我只想知道在7级是否存在对象“XYZ”。这意味着6(我认为)if语句只是为了不让代码在错误中崩溃,这在我看来是过分了no,而不是if
语句!只需使用&
操作符将它们链接在一起即可。您可以将该表达式置于单个if
条件中。有关替代方法,请参见重复项。使用checkPath(客户端“Details.Address.Drive”)进行了尝试,效果良好。当物体变得更复杂时,你认为有什么问题吗?(包含函数等)@DavidDunham它不会为您执行函数,如果这是您的意思的话。除此之外,它应该还可以。不,我的意思是,如果对象复杂性(包含函数)可能会破坏代码的功能,因为在对象中包含函数并不“常见”。正如我所说,如果检查包含函数的路径,它将不会执行它,因此不会继续检查下一个属性。看起来不错。使用checkPath(客户端“Details.Address.Drive”)进行了尝试,效果良好。当物体变得更复杂时,你认为有什么问题吗?(包含函数等)@DavidDunham它不会为您执行函数,如果这是您的意思的话。除此之外,它应该还可以。不,我的意思是,如果对象复杂性(包含函数)可能会破坏代码的功能,因为在对象中包含函数并不“常见”。正如我所说,如果检查包含函数的路径,它将不会执行它,因此不会继续检查下一个属性。