在交换机案例中Javascript多个决定

问题描述 投票:0回答:4

我在运行代码时遇到困难,因为此代码在javascript中打印出“未知”,因此在切换案例中会检查两个条件

['police',false]!=['police',false]

有没有办法使用switch-case而不是嵌套的ifs来实现此代码?

var option='police';
var urgent=false;

switch([option,urgent])
{
case ['police',true]:
       console.log('police,true');
       call_police_urgent();
       break;
case ['police',false]:
       console.log('police,false');
       call_police();
       break;
case ['hospital',true]:
       console.log('hospital,true');
       call_hospital_urgent();
       break;
case ['hospital',false]:
       console.log('hospital,false');
       call_hospital();
       break;
case ['firestation',true]:
       console.log('firestation,true');
       call_firestation_urgent();
       break;
case ['firestation',false]:
       console.log('firestation,false');
       call_firestation();
       break;
default:
       console.log('unknown');
}
javascript node.js
4个回答
4
投票

您的代码不起作用,因为即使它们看起来相同,一个数组文字永远不会等于另一个数组文字。有很多方法可以解决这个问题,但是大多数方法都归结为将数组转换为可以比较的数据,例如:字符串:

let str = (...args) => JSON.stringify(args);

switch (str(option, urgent)) {
    case str('police', false):
        console.log('police,false');
        break;
    case str('hospital', true):
        console.log('hospital,true');
        break;
    default:
        console.log('unknown');
}

这适用于您的简单情况,但不是一般情况,因为并非所有内容都可以进行字符串化。


2
投票

您可以将选项数组转换为字符串:

var option='police';
var urgent=false;

switch([option,urgent].join())
{
case 'police,true':
       console.log('police,true');
       break;
case 'police,false':
       console.log('police,false');
       break;
case 'hospital,true':
       console.log('hospital,true');
       break;
case 'hospital,false':
       console.log('hospital,false');
       break;
case 'firestation,true':
       console.log('firestation,true');
       break;
case 'firestation,false':
       console.log('firestation,false');
       break;
default:
       console.log('unknown');
}

0
投票

我不知道你想要做什么,但你的上面的代码javascript引擎和运行时环境对你大喊大叫。

其次[]文字可以而且永远不会等于另一个[]文字

选择这两者之间

var option='police';
var urgent=false;

function first_switch(option,urgent) {
    switch(option) {
    case "police":
        if ( urgent )
            console.log('police,true');
        else
            console.log('police,false');
        break;
    case "hospital":
        if ( urgent )
            console.log('hospital,true');
        else
            console.log('hospital,false');
        break;
    case "firestation":
        if ( urgent )
            console.log('firestation,true');
        else
            console.log('firestation,false');
        break;
    default:
        console.log('unknown');
    }
}

function second_switch(option,urgent) {

    if ( urgent ) {

        switch(option) {
        case "police":
        case "hospital":
        case "firestation":
            console.log(`${option}`, "true");
            break;
        default:
            console.log('unknown');
        }

        return ;
    }

    switch(option) {
    case "police":
    case "hospital":
    case "firestation":
        console.log(`${option}`, "false");
        break;
    default:
        console.log('unknown');
    }
}

first_switch(option,urgent);
first_switch(option, true);

second_switch(option, urgent);
second_switch(option, true);

0
投票

我们可以在不使用switch case的情况下创建相同的功能。我们可以创建一个查找表,如:

var emergencyLookupTable = {
  police: [{
      case: true,
      fn: call_police_urgent
    },
    {
      case: false,
      fn: call_police
    }
  ],
  hospital: [{
      case: true,
      fn: call_hospital_urgent
    },
    {
      case: false,
      fn: call_firestation_urgent
    }
  ],
  firestation: [{
      case: true,
      fn: call_firestation_urgent
    },
    {
      case: false,
      fn: call_firestation
    }
  ]
}

并将此对象传递给正在寻找正确案例的emergency

function emergency(lookup, option, urgent) {
  if (lookup[option]) {
    lookup[option]
      .filter(function(obj) {
        return obj.case === urgent
      })
      .forEach(function(obj) {
        obj.fn()
      })
  } else {
    console.log('unknown')
  }
}

emergency(emergencyLookupTable, 'police', true)

Working Example

var emergencyLookupTable = {
  police: [{
      case: true,
      fn: call_police_urgent
    },
    {
      case: true,
      fn: call_police_urgent2
    },
    {
      case: false,
      fn: call_police
    }
  ],
  hospital: [],
  firestation: []
}

function emergency(lookup, option, urgent) {
  if (lookup[option]) {
    lookup[option]
      .filter(function(obj) {
        return obj.case === urgent
      })
      .forEach(function(obj) {
        obj.fn()
      })
  } else {
    console.log('unknown')
  }
}

function call_police_urgent() {
  console.log('call the police!')
}

function call_police_urgent2() {
  console.log('call the police again!')
}

function call_police() {
  console.log('call the police..')
}

emergency(emergencyLookupTable, 'police', true)
emergency(emergencyLookupTable, 'police', false)
© www.soinside.com 2019 - 2024. All rights reserved.