2013-07-18 46 views
2

在下面的代码片段,嵌套(状态)?真:虚假陈述在JavaScript

var paintMode = data.hasOwnProperty('regions') ? 
     'regions' : data.hasOwnProperty('vpcs') ? 
     'vpcs' : data.hasOwnProperty('zones') ? 
     'zones' : data.hasOwnProperty('subnets') ? 
     'subnets' : data.hasOwnProperty('clusters') ? 'clusters' : null; 

我已经使用了深度嵌套(condition) ? true : false - 这是可以接受的?它是优化的吗?如果它的不好有另一种选择?

它在一个执行少量SVG操作的递归函数中使用,如果你好奇,这里是函数片断。

function paintGroups(data) { 
    var paintMode = data.hasOwnProperty('regions') ? 'regions' : data.hasOwnProperty('vpcs') ? 'vpcs' : data.hasOwnProperty('zones') ? 'zones' : data.hasOwnProperty('subnets') ? 'subnets' : data.hasOwnProperty('clusters') ? 'clusters' : null, 
     depth = data[paintMode].length, 
     i, 
     Shape; //= raphealObj.rect(); 

    // Register stacking order 
    // Paint a shape with styles based on paintMode 
    // Store its id & Label for other ops. 

    if(paintMode) { 
     for(i = 0; i < depth; i++) { 
      paintGroups(data[paintMode][i]); 
     } 
    } 

    // to reverse the order of paint - place your statements here 
} 
+1

假设这些都不是 “falsey” 值('FALSE','0',' “”','NaN','null') ,使用级联OR语句的可读性和可维护性更高:'var paintMode = data.regions || data.vpcs ...',在这两种情况下,性能可以忽略不计。 – jbabey

+0

因此'var paintData = data.regions || data.vpcs ...'嗯,它是一个选项。如果我调整我的程序逻辑的其余部分,我可以摆脱这一点。 – Rayraegah

+0

它是一个网络层次结构,虚拟机,防火墙和存储'里面'集群'里面'子网'里面'区'里面'虚拟私有云'里面'地区。与AWS有关。 树的最后一个节点可以是空的。 – Rayraegah

回答

1

由于分支预测,缓存,yada yada yada,一般来说使用二进制操作应该比带分支的条件语句快。但是你的代码很好。我喜欢& & ||但这只是一种偏好,并不基于任何经验。

var data = {a: 1, b: 2, c: 3}; 
var result = data.x || 
    data.y && "y" || 
    data.z && "z" || 
    data.w && "w" || 
    null; 

我不喜欢打字.hasOwnProperty。

编辑后居然在看你的代码

var paintMode = data.regions || data.vpcs || data.zones || data.subnets || data.clusters || null; 
if(paintNode) { 
    for(var i=0; i<paintMode.length; i++) 
     paintGroups(paintMode[i]); 
} 
+0

刚刚通过我的控制台运行你的代码,看起来不错,更可读,因为@ jbabey建议。 – Rayraegah