Lodash与使用新的ES6可选参数相比如何?
我有以下代码:
location: {
latitude: response.pickupLocation.latitude || "",
longitude: response.pickupLocation.longitude || ""
},
Lodash我知道我可以跑:
latitude: get(response, 'pickupLocation.latitude', '')
或者我可以创建一个接收对象和路径的函数,并始终返回''
作为默认回退。除了代码更短的事实之外,在这里使用Lodash还有什么优势吗?
答案 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.latitude
为0
)。此函数将返回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;
}