我能在switch语句中检查对象属性吗?

12

我正在尝试从AJAX请求中处理一系列可能的响应,并希望在switch语句中执行此操作。

data.message保存了我感兴趣的信息,但它可以作为字符串或JSON对象返回

测试字符串很简单,但我想知道是否可以像这样做:

switch (data.message) {
    case 'ok':
        ...
    case 'another string':
        ...
    case (this.id == 123):
        ...
}

是的,你可以做到这一点。 - Bartosz Herba
3
我会反其道而行之。不,这不是 switch 语句的工作方式。 - Andy
2个回答

22

简单的回答是不支持。

作为解决方法,您可以尝试使用以下形式的开关:

switch (true) {
    case (data.message === 'ok'):
        ...
    case (data.message === 'another string'):
        ...
    case (data.message.id == 123):
        ...
}

这可能比if-else语句的列表看起来更好。


6
那还挺糟糕的。使用 if 语句吧,这样更清晰明了。 - Andy
1
@Andy 这取决于情况... 有时它看起来比 if-else 列表更好,也更容易阅读,就我所知,我们不是在谈论 3 个 if-else 语句,而是 10-20 个连续的语句... - Andrii Muzalevskyi
1
我本来要发布这个注释,但是我会将它作为评论添加在这里,因为它指向了这个特定用法的参考。在MDN文档网站上有一个有趣(并且看起来有些奇怪)的switch语句用法:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/switch#Rewriting_multiple_If_statements_with_Switch - Ken H.
2
如果我在代码审查中看到这样的代码,我会要求开发人员重写它。我认为它并没有特别好地展示代码的意图。当然,这只是我的个人观点。 - Andy
谢谢您的建议!不过我认为在这个阶段最好还是坚持使用一堆if/else语句。 - Elliott Rhys
1
这是一个不错的解决办法,特别是如果您想在对象中对不适合switch语句的所有其他键使用“默认值”。这可能有1个,2个或一百万个。如果您想精确地考虑到这一点,那么这是一个不错的方法。 - Pedro Ferreira

0
这可以通过首先使用 JSON.stringify() 将对象转换为 JSON,然后针对 JSON 表示进行测试来完成。只需确保不包括任何额外的空格,因为这需要严格相同的 JSON(最好通过检查 console.log(JSON.stringify(data)) 获取该值)。
这将类似于:
           switch (JSON.stringify(data)) {
                case '{"message":"your message","anotherPropety":"another value"}' : {
                   // your logic             
                   break;
                }
                default: {
                    // your logic
                }
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接