_.get 的不确定行为
Uncertain behaviour of _.get
let a = {
b : null
}
_.get(a, 'b',''); //return null
但是
_.get (a, null, '') //return ''
null 是 _.get() 的虚假值吗?
let a = {
b : {c:{
}
} //basically a nested object
我正在尝试执行 _.get(a, 'b.c','').toString()
但出现错误,因为 _.get return 为空。最好的可读方式是什么?
第三个参数 defaultValue
将只返回 undefined
个解析值,而不是 null
。 see docs
如果您想要 null
或 undefined
的后备值,请使用 nullish coalescing operator:
(_.get(a, "b.c") ?? "").toString()
以下是使用不同机制定义默认值的不同结果:
let a;
a = { b: null };
_.get(a, "b", ""); // null
_.get(a, "b") ?? ""; // ""
_.get(a, "b") || ""; // ""
a = { };
_.get(a, "b", ""); // ""
a = { b: undefined };
_.get(a, "b", ""); // ""
a = { b: 0 };
_.get(a, "b") || ""; // ""
_.get(a, "b") ?? ""; // 0
在
_.get(a, 'b','');
你要求 属性 a['b']
,恰好是 null
,而不是 undefined
,所以你得到 null
作为最后结果。接下来,在
_.get(a, null, '');
你要求 属性 a['null']
,它不存在,所以它是 undefined
,你最终得到备用值 ''
。最后,用
let a = {b: {c: {}}};
_.get(a, 'b.c', '');
您似乎在要求 a['b']['c']
,这将是一个空对象。但是,虚线路径表示法是 Lodash-specific。如果您使用的是 Underscore,默认情况下路径被解释为 a['b.c']
,它不存在并且是 undefined
。在这种情况下,您应该得到 ''
作为最终结果。我看不出这个表达式会导致 null
,即使您使用的是 a = {b: null}
.
的原始值
如果您实际上正在使用 Underscore 并且想要检索 b
属性 中嵌套的 c
对象,您有两个选择。首先,您可以使用数组路径表示法,它可以在 Underscore 和 Lodash 之间移植:
_.get(a, ['b', 'c'], '');
其次,您可以覆盖 _.toPath
以启用所有 Underscore 函数的点路径表示法:
const originalToPath = _.toPath;
_.toPath = function(path) {
if (_.isString(path)) return path.split('.');
return originalToPath(path);
}
_.get(a, 'b.c', '');
我不推荐这样做,因为它会破坏试图检索名称中包含句点字符 .
的属性的代码。我提到它是为了完整性;用你自己的判断。
let a = {
b : null
}
_.get(a, 'b',''); //return null
但是
_.get (a, null, '') //return ''
null 是 _.get() 的虚假值吗?
let a = {
b : {c:{
}
} //basically a nested object
我正在尝试执行 _.get(a, 'b.c','').toString()
但出现错误,因为 _.get return 为空。最好的可读方式是什么?
第三个参数 defaultValue
将只返回 undefined
个解析值,而不是 null
。 see docs
如果您想要 null
或 undefined
的后备值,请使用 nullish coalescing operator:
(_.get(a, "b.c") ?? "").toString()
以下是使用不同机制定义默认值的不同结果:
let a;
a = { b: null };
_.get(a, "b", ""); // null
_.get(a, "b") ?? ""; // ""
_.get(a, "b") || ""; // ""
a = { };
_.get(a, "b", ""); // ""
a = { b: undefined };
_.get(a, "b", ""); // ""
a = { b: 0 };
_.get(a, "b") || ""; // ""
_.get(a, "b") ?? ""; // 0
在
_.get(a, 'b','');
你要求 属性 a['b']
,恰好是 null
,而不是 undefined
,所以你得到 null
作为最后结果。接下来,在
_.get(a, null, '');
你要求 属性 a['null']
,它不存在,所以它是 undefined
,你最终得到备用值 ''
。最后,用
let a = {b: {c: {}}};
_.get(a, 'b.c', '');
您似乎在要求 a['b']['c']
,这将是一个空对象。但是,虚线路径表示法是 Lodash-specific。如果您使用的是 Underscore,默认情况下路径被解释为 a['b.c']
,它不存在并且是 undefined
。在这种情况下,您应该得到 ''
作为最终结果。我看不出这个表达式会导致 null
,即使您使用的是 a = {b: null}
.
如果您实际上正在使用 Underscore 并且想要检索 b
属性 中嵌套的 c
对象,您有两个选择。首先,您可以使用数组路径表示法,它可以在 Underscore 和 Lodash 之间移植:
_.get(a, ['b', 'c'], '');
其次,您可以覆盖 _.toPath
以启用所有 Underscore 函数的点路径表示法:
const originalToPath = _.toPath;
_.toPath = function(path) {
if (_.isString(path)) return path.split('.');
return originalToPath(path);
}
_.get(a, 'b.c', '');
我不推荐这样做,因为它会破坏试图检索名称中包含句点字符 .
的属性的代码。我提到它是为了完整性;用你自己的判断。