我想确保两个属性(引用对象)connected
和connections
都包含至少一个属性,如下所示:
if ((Object.keys(layer[i1].connected).length > 0
&& Object.keys(layer[i1].connections).length > 0) || /* other logic omitted */) {
//do stuff
}
到目前为止这是有效的。但我意识到我需要确保connected
和connections
中不仅存在属性,而且还要确保这些内容包含等于active
的属性true
。
所以内容必须是:
connections : { //at least one is true
34 : {
active : true
},
37 : {
active : false
},
38 : {
active : false
}
}
和(&&
)
connected : { //at least one is true
12 : {
active : true
},
22 : {
active : true
}
}
不
connections : {
34 : {
active : false
},
}
或
connected : {}
我只是想知道是否有一种简单,优雅的方式来执行这种检查,而不是我想到的混乱选项。 有没有一种优雅的方式来做到这一点?显然有很多方法可以做到这一点,但我对单线方法非常感兴趣,类似Object.keys
非常整齐的方式公开属性的数量。
答案 0 :(得分:1)
你想要的是非常具体的,所以为什么不只是制作你自己的帮手功能:
const hasActiveProp = obj => Object.keys(obj).some(k => obj[k].active)
然后你可以这样做:
if(hasActiveProp(layer[i1].connected) && hasActiveProp(layer[i1].connections)){
// do something here
}
请注意,为了使您的代码更优雅,我不会专注于您的具体问题,而是您需要执行此检查的原因。您应该弄清楚是否有任何方法可以使用不同的格式获取数据,以便检查变得更加直观。
答案 1 :(得分:0)
我认为应用测试条件的最短方式是这样的:
Object.keys(layer[i1].connections).some(p=>layer[i1].connections[p].active)
我不认为这特别优雅,但至少它仍然只是一个表达。
我将其封装在一个函数中,以便您可以在if
条件内调用该函数两次。
答案 2 :(得分:0)
这是一种有趣的方法,可以在一行中完成:)如果你对正则表达式很好,你可以通过1次测试来处理所有情况,而且你不需要检查obj的可用性。
var obj = {
connections: { //at least one is true
34: {
active: true
},
37: {
active: false
},
38: {
active: false
}
},
connected: { //at least one is true
12: {
active: true
},
22: {
active: false
}
}
}
console.log(JSON.stringify(obj))
console.log(/{"active":true}/.test(JSON.stringify(obj.connections)) && /{"active":true}/.test(JSON.stringify(obj.connected)))