Javascript 测试对象是否包含具有特定属性值的嵌套对象

Javascript 测试对象是否包含具有特定属性值的嵌套对象,javascript,Javascript,我想确保两个属性(引用对象)connected和connections都至少包含一个属性,如下所示: if ((Object.keys(layer[i1].connected).length > 0 && Object.keys(layer[i1].connections).length > 0) || /* other logic omitted */) { //do stuff } Object.keys(layer[i1].connections).

我想确保两个属性(引用对象)
connected
connections
都至少包含一个属性,如下所示:

if ((Object.keys(layer[i1].connected).length > 0 
&& Object.keys(layer[i1].connections).length > 0) || /* other logic omitted */) {
    //do stuff
}
Object.keys(layer[i1].connections).some(p=>layer[i1].connections[p].active)
到目前为止,这是可行的。但是我意识到我不仅需要确保属性存在于
connected
connections
中,而且这些内容还包含属性
active
,该属性等于
true

因此,内容需要:

connections : { //at least one is true
    34 : {
        active : true 
    },
    37 : {
        active : false
    },
    38 : {
        active : false
    }
}
和(
&&

不是

connections : {
    34 : {
        active : false
    },
}


我只是想知道是否有一种简单、优雅的方式来执行这种检查,而不是我正在考虑的混乱选项有一种优雅的方法可以做到这一点吗?显然有很多方法可以做到,但我对一行方法非常感兴趣,类似于
Object.keys
如何巧妙地公开属性的数量

我能想到的应用您的测试条件的最短方法如下:

if ((Object.keys(layer[i1].connected).length > 0 
&& Object.keys(layer[i1].connections).length > 0) || /* other logic omitted */) {
    //do stuff
}
Object.keys(layer[i1].connections).some(p=>layer[i1].connections[p].active)
我不认为这特别优雅,但至少它仍然是一个单一的表达。< / P>
我将它封装在一个函数中,这样您就可以在
if
条件中调用函数两次。

您想要的是非常具体的,那么为什么不创建自己的helper函数呢:

const hasActiveProp = obj => Object.keys(obj).some(k => obj[k].active)
然后你可以做:

if(hasActiveProp(layer[i1].connected) && hasActiveProp(layer[i1].connections)){
  // do something here
}


但要注意的是,为了使代码优雅,我不会关注您的具体问题,而是为什么需要执行此检查。您应该弄清楚是否有任何方法可以以不同的格式获取数据,从而使检查变得更直观。

这里有一个有趣的方法,可以在一行中完成:)如果您对正则表达式很在行,您可以通过一个测试处理所有情况,而不需要检查obj的可用性

var obj={
连接:{//至少有一个为true
34: {
主动:正确
},
37: {
活动:错误
},
38: {
活动:错误
}
},
已连接:{//至少有一个为true
12: {
主动:正确
},
22: {
活动:错误
}
}
}
log(JSON.stringify(obj))

console.log(/{“active”:true}/.test(JSON.stringify(obj.connections))&&/{“active”:true}/.test(JSON.stringify(obj.connected))
这实际上是一个比我想象的更优雅的检查。谢谢编辑:必须将答案授予NNN,因为他的答案本质上是相同的,并且是第一个提交的@维齐奥-如果你接受这个答案,我不会介意的。更完整的一点是,我只建议将测试封装在函数中,而这个答案实际上显示了函数…顺便说一句,我想不出正确的方法来命名我的问题,如果你想将标题编辑为不那么模糊的内容,我很乐意接受编辑。好的,我对标题进行了编辑,使其更加具体。不过,我不确定新标题是否优雅。