清理复杂/不可读的if语句,多次使用typeof运算符

时间:2015-01-22 05:14:42

标签: javascript

我有一个JavaScript对象,其中包含绘制了哪些轴数据。我需要用它来确定它是2D图(有X / Y,Y / Z或X / Z的数据)还是3D图(X / Y / Z上有数据)。

以下代码有效,我相信涵盖所有这些情况。但它非常难以理解和复杂。有没有办法改进这一点,使其更具可读性和/或简单性?

提前感谢您提供任何帮助。

var axes = {
    "X": "Column 1",
    "Y": "Column 2",
    "Z": "Column 3"
}

if (typeof axes.X == 'undefined' && typeof axes.Y !== 'undefined' && typeof axes.Z !== 'undefined') {
    alert("2D plot on Y and Z");
} else if (typeof axes.X !== 'undefined' && typeof axes.Y !== 'undefined' && typeof axes.Z == 'undefined') {
    alert("2D plot on X and Y");
} else if (typeof axes.X !== 'undefined' && typeof axes.Y == 'undefined' && typeof axes.Z !== 'undefined') {
    alert("2D plot on X and Z");
} else if (typeof axes.X !== 'undefined' && typeof axes.Y !== 'undefined' && typeof axes.Z !== 'undefined') {
    alert("3D plot");
}

2 个答案:

答案 0 :(得分:3)

你可以使用循环

var axes = {
    "X": "Column 1",
    "Y": "Column 2",
    "Z": "Column 3"
}

var axesChecked = [];

for (var prop in axes) {
  if(axes.hasOwnProperty(prop) && typeof axes[prop] !== 'undefined'){
    axesChecked.push(prop);
  }
}

switch(axesChecked.length) {
  case 3:
    alert("3D plot");
    break;
  case 2:
    alert("2D plot " + axesChecked.join(' and '));
    break;
  default:
    throw "Need more axes";
    break;
}

答案 1 :(得分:2)

查看您的代码,看起来只是使用truthy/falsey值可以用来简化语句并使其保持清晰。

var axes = {
    "X": "Column 1",
    "Y": "Column 2",
    "Z": "Column 3"
};

if (!axes.X && axes.Y && axes.Z) {
    alert("2D plot on Y and Z");
} else if (axes.X && axes.Y && !axes.Z) {
    alert("2D plot on X and Y");
} else if (axes.X && !axes.Y && axes.Z) {
    alert("2D plot on X and Z");
} else if (axes.X && axes.Y && axes.Z ) {
    alert("3D plot");
}