Javascript 建立备用链的最干净的方法?

Javascript 建立备用链的最干净的方法?,javascript,google-maps,google-maps-api-3,maps,street-address,Javascript,Google Maps,Google Maps Api 3,Maps,Street Address,所以,我是从GooglePlacesAPI对地址进行地理编码的。有38种Google地址组件类型,我们有5种内部地址组件类型,因此我需要一个系统,将一些Google类型映射到我们的内部类型,并提供备用 例如: var neighbourhood = googleResponse.neighborhood || googleResponse.sublocality_level_2 || googleResponse.sublocality_level_1 做这件事最好/最干净/最有效的方法是什么

所以,我是从GooglePlacesAPI对地址进行地理编码的。有38种Google地址组件类型,我们有5种内部地址组件类型,因此我需要一个系统,将一些Google类型映射到我们的内部类型,并提供备用

例如:

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

做这件事最好/最干净/最有效的方法是什么?基本上,我需要为某个返回值分配一个var,除非该返回值未定义,然后沿着链向下移动。

我认为您的方法是正确的-使用短路OR比使用某种分支语句对我来说要干净得多。我的两项建议是:

  • 您可能应该添加某种硬编码值(可能是一个空字符串?取决于您的用例)作为最终回退,这样,如果找不到所有选项,您就不会将变量设置为意外值。我认为百分之百地明确所有可能退回的东西始终是一种好的做法
  • 我建议将该逻辑提取到函数中,这样,如果您想在其他地方重用它,它将更易于维护。即使你不认为你需要再次使用它,如果你以后改变主意的话,这仍然是值得的——必须检查并替换一段代码的每个实例是令人难以置信的乏味!它还使您的代码更易于测试-您可以通过硬编码的
    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\u number+googleResponse.route
。。。在这种情况下,我必须检查两个更复杂的值的存在性。