Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Object.hasOwnProperty具有多个级别,没有错误_Javascript_Hasownproperty - Fatal编程技术网

Javascript Object.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) …但我

我想知道是否有某种方法可以将hasOwnProperty用于多个级别的对象

举例说明: 我有以下目标:

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它不会为您执行函数,如果这是您的意思的话。除此之外,它应该还可以。不,我的意思是,如果对象复杂性(包含函数)可能会破坏代码的功能,因为在对象中包含函数并不“常见”。正如我所说,如果检查包含函数的路径,它将不会执行它,因此不会继续检查下一个属性。