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

时间:2017-03-23 01:45:53

标签: javascript

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

if ((Object.keys(layer[i1].connected).length > 0 
&& Object.keys(layer[i1].connections).length > 0) || /* other logic omitted */) {
    //do stuff
}

到目前为止这是有效的。但我意识到我需要确保connectedconnections中不仅存在属性,而且还要确保这些内容包含等于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非常整齐的方式公开属性的数量。

3 个答案:

答案 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)))