【发布时间】:2021-09-20 23:11:17
【问题描述】:
考虑以下几点:
var obj =
{
something: "blabla",
otherthing: "mehmeh"
}
let a = obj["something"];
// blabla
let a = obj["doesnotexist"];
// undefined
let a = obj["doesnotexist"] ?? "sorry";
// sorry
let a = obj["something"]["level2"];
let a = obj["something"]["level2"] ?? "sorry";
// Uncaught TypeError
我必须处理很多我无法知道某个对象的结构是否“完整”的情况,可以这么说,但我仍然想访问深度嵌套的属性并获得默认返回值,以防结构是在某种程度上损坏了。
所以我使用了这个丑陋的功能:
function Safe_Traverse(object, fields, saferesult)
{
if(typeof object != "array" && typeof object != "object") return saferesult;
var value = saferesult;
var check = object;
var i = 0;
var l = fields.length;
while(typeof check[fields[i]] != "undefined" && check[fields[i]]!=null)
{
check = check[fields[i]];
if(i == l-1) value = check; else i = i + 1;
}
return value;
}
let a = Safe_Traverse(obj, ["something", "level2"], "sorry");
// sorry
由于我迷失在 ECMAScript 的许多持续更新中,我想知道现在是否有一种内置方法可以实现上述目标。
谢谢
【问题讨论】:
-
你可以使用optional chaining
-
@NickParsons 很有趣,可以工作。但不适用于上述访问属性的方式 (object["field"]["field"]["field"] .... )
-
@resle 你的意思是括号符号吗?链接的文档解释了可选链接如何与括号表示法一起使用。
-
@resle 你可以按照
let a = obj["field"]?.["field"]?.["field"] ?? "sorry";的方式来使用它
标签: javascript arrays object ecmascript-next