Lodash获得vs es6后备值?

时间:2017-08-22 07:41:05

标签: javascript functional-programming redux lodash

Lodash与使用新的ES6可选参数相比如何?

我有以下代码:

location: {
  latitude: response.pickupLocation.latitude || "",
  longitude: response.pickupLocation.longitude || ""
},

Lodash我知道我可以跑:

latitude: get(response, 'pickupLocation.latitude', '')

或者我可以创建一个接收对象和路径的函数,并始终返回''作为默认回退。除了代码更短的事实之外,在这里使用Lodash还有什么优势吗?

4 个答案:

答案 0 :(得分:11)

_.get的优点是,如果存在属性,则省略继续检查,这是必要的。

latitude: response && response.pickupLocation && response.pickupLocation.latitude || "",

答案 1 :(得分:6)

这与ES6无关,它只是逻辑OR运算符。 “可选参数”听起来与default parameters有关,但这些参数在function签名中使用。

就个人而言,我会坚持使用逻辑OR,因为它不需要外部库。另外,我建议您在访问对象属性时永远不要使用字符串,因为它会使重构,用法搜索,TypeScript的可选使用变得复杂,并阻碍代码完成。

如果要确保访问null类型的属性时不会发生异常,可以使用here所述的方法:

getSafe(() => response.pickupLocation.latitude) || ''

答案 2 :(得分:3)

对于最新的浏览器,或者通过使用 polyfill 或转译器,您还可以使用可选链接和无效合并运算符,例如:

latitude: response?.pickupLocation?.latitude ?? ''

答案 3 :(得分:0)

请参阅@str的答案,如果response没有pickupLocation属性,则无论OR运算符如何,都会导致TypeError(无法读取未定义的属性纬度)。

您可以将其包装在try-catch中。然后,您将尝试返回response.pickupLocation.latitude || fallback或在catch块中返回fallback

这将不处理由假值定义的(假设response.pickupLocation.latitude0)。此函数将返回fallback而不是0的值。可以通过检查typeof(typeof response.pickupLocation.latitude !== 'undefined' ? response.pickupLocation.latitude : fallback)来轻松处理,但是我们仍在讨论硬编码的对象路径。 接受的答案中也会出现相同的问题。

要为任何对象路径动态处理此问题,必须遍历提供的对象,检查hasOwnProperty并通过每次迭代剥离嵌套的属性,直到到达指定路径的末尾。像这样:

const getSafe = (object, path, fallback) => {
    const fragments = path.split('.')
    let value

    for (let i = 0; i < fragments.length; i++) {
        if (!obj.hasOwnProperty(fragments[i])) {
            return fallback;
        }
        value = object[fragments[i]];
    }

    return value;
}