【问题标题】:check if key exist in object javascript检查对象javascript中是否存在键
【发布时间】:2019-11-12 22:10:59
【问题描述】:

我有一个对象,其中 if 键不存在使用 javascript 设置为 null。

如果对象obj中不存在键,例如ccy不存在cnMYCA,如何使用javascript分配并设置为null。

var obj=[{
  "cn": "TH",
  "lang": "thai",
  "bank": "yes",
  "ccy": "THB"
},{
   "cn": "MY",
   "lang": "malay",
},{
   "cn": "CA",
   "lang": "english",
   "bank": "yes"
}]

render(){
  obj.map(e=>
  return html`
    <h1>${e.cn}</h1>
    <h5>${e.lang}</h5>
    <h6>${e.ccy}</h6>
`
 )
}

【问题讨论】:

  • 你能添加预期的输出吗
  • ${e.ccy === undefined ? null : e.ccy}
  • @JaromandaX 感谢您的回复,在我的obj 中,因为动态如何检查密钥名称本身存在
  • 更改了评论,所以也许更清楚了?虽然下面的答案更正确
  • &lt;h6&gt;${e.ccy || null}&lt;/h6&gt; 不会成功吗?

标签: javascript html arrays object ecmascript-6


【解决方案1】:

您可以使用运算符in 来检查密钥是否存在,如下所示:

运算符in 是避免错误检查错误值的最安全方法。

{"ccy" in e ? e.ccy : null}

【讨论】:

  • ${'ccy' in e ? e.ccy : null} 以适应 OP 添加的代码
  • 你不会(必然)需要将其分配给e
【解决方案2】:

最简单的做法,只要你能确定e.ccy 不会是假的(falseundefinednull0""NaN)是使用逻辑或运算符||

${e.ccy || null}

【讨论】:

  • 我知道@Ele - 请参阅我的答案的第一行。
【解决方案3】:

任何未在 javascript 对象中定义的键都将被视为未定义,因此您可以检查

(typeof obj.ccy === "undefined") ? null : obj.ccy;
(obj.ccy == undefined) ? null : obj.ccy;

如果您不熟悉三元表达式。您也可以将上述内容写成这样。

if(obj.ccy == undefined){
   obj.ccy = null;
}

【讨论】:

    【解决方案4】:

    有多种方法可以检查给定键是否存在于对象中。

    if(!obj[0].hasOwnProperty('cn')) {
        obj[o].cn = null
    }
    

    if(typeof obj[0].cn === 'undefined') {
        obj[0].cn = null;
    }
    

    if(obj[0].cn === undefined) {
        obj[0].cn = null;
    }
    

    后两者在这种情况下非常相似,typeof 通常用于检查代码中是否定义了变量并可以访问。

    现在真实的例子是这样的:

    var missing = ['cn', 'ccy'];
    for(var i = 0; i < obj.length; i++) {
        for(var j = 0; j < missing.length; j++) {
            if(!obj[i].hasOwnProperty(missing[j])) {
                obj[i][missing[j]] = null;
            }
        }
    }
    

    【讨论】:

      【解决方案5】:

      如果您不想将默认后备值写入模板并希望保持模板干净,您还可以在渲染前预处理数据并设置缺失值:

      var obj = [{
        "cn": "TH",
        "lang": "thai",
        "bank": "yes",
        "ccy": "THB"
      }, {
        "cn": "MY",
        "lang": "malay",
      }, {
        "lang": "english",
        "bank": "yes"
      }]
      
      obj = obj.map(({
        cn = null,
        ccy = null,
        ...rest
      }) => Object.assign(rest, { cn, ccy }))
      
      console.log(obj)

      【讨论】:

        【解决方案6】:
        var q = [...Object.keys(obj[0]),...Object.keys(obj[1]),...Object.keys(obj[2])]
        for(let i=0;i<obj.length;i++){
         for(let k=0;k<q.length;k++){
           if(!(q[k] in obj[i])){
            obj[i][q[k]] = null
          }
         }
        }
        console.log(obj)
        

        【讨论】:

        • 请添加注释,说明您的代码如何解决问题以改进此答案。
        • 它可以用于任何对象中包含可变键的对象数组中,不一定在第一个索引中,您也不需要给出键的名称。
        • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请edit您的回答添加一些解释,包括您所做的假设。
        猜你喜欢
        • 2020-06-18
        • 2021-11-25
        • 1970-01-01
        • 1970-01-01
        • 2013-09-26
        相关资源
        最近更新 更多