如果 JSON 数据包含未定义,则附加不同的变量

Posted

技术标签:

【中文标题】如果 JSON 数据包含未定义,则附加不同的变量【英文标题】:Append different variable if JSON data contains undefined 【发布时间】:2021-09-12 21:00:40 【问题描述】:

我正在将一个 excel 文件解析为 JSON,总体上运行良好。但是,如果变量包含来自 JSON 的特定文本,我正试图弄清楚如何附加不同的 html

到目前为止,这是我所拥有的:

/* This is part of the Excel conversion. Added for reference */
var workbook = XLSX.read(bstr,  type: "binary" );
var first_sheet_name = workbook.SheetNames[0];
var worksheet = workbook.Sheets[first_sheet_name];

  var jData = XLSX.utils.sheet_to_json(worksheet,  raw: false );

  $.each(jData, function (i, f) 
    var hide = f.Hidden;
    var el =
     "<div class='thing'>" +
      "<h2>" +
      f["First Name"] +
      "&nbsp;" +
      f["Last Name"] +
      "</h2>" +
      "<h3>" +
      f.Title +
      "</h3>" +
      "<p>" +
      f.Comment +
      "</p>" +
      "</div>";
    $(el).appendTo("#wrapper");
  );

但我很好奇的是确保这是有效的:

$.each(jData, function (i, f) 
    var hide = f.Hidden;
    var el =
     "<div class='thing'>" +
      "<h2>" +
      f["First Name"] +
      "&nbsp;" +
      f["Last Name"] +
      "</h2>" +
      "<h3>" +
      f.Title +
      "</h3>" +
      "<p>" +
      f.Comment +
      "</p>" +
      "</div>";
    var other =
     "<div class='thing'>" +
      "<h2>" +
      f["First Name"] +
      "&nbsp;" +
      f["Last Name"] +
      "</h2>" +
      "<h3>" +
      f.Title +
      "</h3><p>Comment Hidden</p></div>";
    if (hide === undefined) 
       $(el).appendTo("#wrapper");
     else 
      $(other).appendTo("#wrapper");
    
  );

总体而言,如果 hide 变量从 JSON 数据返回为 undefined,则它似乎在工作,然后从 el 变量附加 HTML 元素。但如果它确实以 not 未定义的形式返回,则附加来自 other 变量的 HTML。我只是想确保我没有遗漏任何东西。另外,如果有更好的方法来解决这个问题。我觉得它有点“笨拙”,但奇怪的是它似乎在表面上起作用。

【问题讨论】:

要明确,如果f.Hiddenundefined 附加到el,如果f.Hiddentrue OR @ 987654332@ 追加other - 对吗? @RoryMcCrossan - 嗯,更像是如果f.Hidden 不返回undefined 然后附加el。否则,如果它确实返回了 not undefined 的内容,则返回其他内容。基本上,当我console.log 从 JSON 中取出内容时,来自f.Hidden 的数据要么有,要么没有。如果不是,那么它会从 JSON 中以 undefined 的形式返回。我知道...这也让我很头疼,这就是我问的原因,哈哈! 【参考方案1】:

如果f.Hidden 不返回undefined 则追加el

在这种情况下,您可以使用typeof 来确定@​​987654324@ 值的状态。另请注意,在定义Hidden 属性时,我通过从p 中删除注释文本来避免代码中的重复。

$.each(jData, function(i, f) 
  var $el = $(`<div class="thing"><h2>$f["First Name"]&nbsp;$f["Last Name"]</h2><h3>$f.Title</h3><p>$f.Comment</p></div>`);
  if (typeof f.Hidden !== 'undefined')         
    $el.find('p').text('Comment hidden');

  $('#wrapper').append($el);
);

这里要注意的一点是,如果 f.Hiddentrue,这将显示评论 OR false - 这似乎违反直觉。

如果您想在f.Hiddenundefinedtrue 时隐藏评论(这似乎更有意义),代码应如下所示:

$.each(jData, function(i, f) 
  var $el = $(`<div class="thing"><h2>$f["First Name"]&nbsp;$f["Last Name"]</h2><h3>$f.Title</h3><p>$f.Comment</p></div>`);
  if (f.Hidden || true)
    $el.find('p').text('Comment hidden');

  $('#wrapper').append($el);
);

|| true 会将任何虚假值(例如 undefined)强制转换为 true

【讨论】:

明白了,谢谢!是的,我总体上关心的是确保undefined 的验证是正确的(不是你所说的真或假)。但这有助于并清除它。谢谢!

以上是关于如果 JSON 数据包含未定义,则附加不同的变量的主要内容,如果未能解决你的问题,请参考以下文章

如何将字典附加到熊猫数据框?

Swift 4 可解码 - 附加变量

在 ngOnInit() 中使用数据绑定从本地 JSON 文件读取数据会导致未定义的变量

JSON Schema 中的附加项和附加属性有啥区别?

静态模板成员变量具有内部链接但未定义

Codeigniter:将数据传递给查看未定义的变量