【问题标题】:Javascript: default value on missing propertyJavascript:缺少属性的默认值
【发布时间】: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


【解决方案1】:

使用?. 将“nullish”元素返回为undefined

let a = obj?.["something"]?.["doesnotexist"];
// undefined

let a = obj?.["something"]?.["doesnotexist"] ?? "sorry";
// undefined

【讨论】:

    【解决方案2】:

    这取决于您的用例。如果它可以帮助您拥有一个包含默认值的完整对象,如果原始对象没有属性,那么您可以创建一个具有默认值的对象并将其与另一个对象组合:

    const defaultValues = {
      a: 1,
      b: {
        c: 2
      }
    }
    
    const obj = {
      a: 2
    }
    
    const safeObj = {...defaultValues, ...obj}
    
    console.log(safeObj)
    //prints {a: 2 b: { c:2}}

    【讨论】:

      猜你喜欢
      • 2015-06-19
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 2015-06-12
      • 2022-11-11
      相关资源
      最近更新 更多