【问题标题】:Cleanest way to set up a chain of fallbacks?建立后备链的最干净的方法?
【发布时间】:2016-05-23 09:08:57
【问题描述】:

所以,我正在对来自 Google Places API 的地址进行地理编码。有 38 种 Google 地址组件类型,而我们有大约 5 种内部地址组件类型,因此我需要一个系统,将许多 Google 类型映射到我们的内部类型,并带有后备功能。

例如:

var neighbourhood = googleResponse.neighborhood || googleResponse.sublocality_level_2 || googleResponse.sublocality_level_1

最好/最干净/最有效的方法是什么?基本上,我需要将 var 分配给某个返回值,除非该返回值未定义,然后向下移动。

【问题讨论】:

    标签: javascript google-maps google-maps-api-3 maps street-address


    【解决方案1】:

    我认为您的方法是合理的 - 使用短路 OR 感觉比使用某种分支语句要干净得多。我的两个建议是:

    • 您可能应该添加某种硬编码值(可能是一个空字符串?取决于您的用例)作为最终后备,这样如果没有找到所有选项,您就不会结束变量被设置为意想不到的东西。我认为 100% 明确说明所有可能返回的内容始终是一个好习惯。
    • 我建议将该逻辑提取到一个函数中,这样如果您想在其他地方重用它,它会更易于维护。即使您认为不需要再次使用它,如果您以后改变主意,仍然值得这样做 - 必须遍历并替换一段代码的每个实例非常乏味!它还使您的代码更容易测试 - 您可以传入硬编码的 googleResponse 并检查输出是否符合您的期望。

    所以我的方法可能看起来像这样:

    function getNeighborhood(googleResponse) {
        return googleResponse.neighborhood
            || googleResponse.sublocality_level_2
            || googleResponse.sublocality_level_1
            || "";
    }
    
    var neighborhood = getNeighborhood(googleResponse);
    

    编辑:

    针对您的评论,对于必须连接的值,我可以想到几个选项。

    如果只是“有或无”的问题,你可以用三元表达式相当优雅地写出:

    function getStreet(googleResponse) {
        return googleResponse.street_number && googleResponse.route
            ? googleResponse.street_number + googleResponse.route
            : "";
    }
    

    但是,如果您开始尝试将这些嵌套在后备中,它将很快变得非常难以阅读。在这一点上,你最好只依赖 if/else if/else - 它有点啰嗦,但它是可以理解的,而且在我看来这更重要。

    function getStreet(googleResponse) {
        if (googleResponse.street_number && googleResponse.route) {
            return googleResponse.street_number + googleResponse.route;
        }
        else if (/* fallback */) {
            return /* concat here */;
        }
        else {
            // Make sure to always return a value, even if all of
            // the other fallbacks fail!
            return "";
        }
    }
    

    【讨论】:

    • 唯一棘手的情况是一个值是两个字符串的连接,例如var street = googleResponse.street_number + googleResponse.route...在这种情况下,我必须检查是否存在两个更复杂的值。跨度>
    猜你喜欢
    • 2018-11-07
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2012-06-29
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多