建立一系列后备的最简洁方法?

时间:2016-05-23 09:08:57

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

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

例如:

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

最好/最干净/最有效的方法是什么?基本上,我需要为一些返回值赋​​值var,除非返回值未定义,然后向下移动链。

1 个答案:

答案 0 :(得分: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 "";
    }
}