【问题标题】:Removing nulls from html popup从 html 弹出窗口中删除空值
【发布时间】:2017-05-27 11:31:15
【问题描述】:

我想格式化弹出窗口的内容,以便完全删除 null 值。此时,我的弹出窗口中填充了features.properties 数组。 properties 中有 20 个元素,根据查询的功能,其中许多值将是 null

  var feature = features[0];

  // Populate the popup and set its coordinates
  // based on the feature found.

  popup.setLngLat(feature.geometry.coordinates)
      .setHTML('<div><b>' + feature.properties.city + '</div></b>' + '<div>'
       + feature.properties.course1 + '</div>' + '<div>'+
       feature.properties.course2 + '<div>' + feature.properties.course3 + '</div>')
      .addTo(map);

此时,带有一些 null 值的示例弹出窗口如下所示:

我的目标是消除null 值,而不是在弹出窗口中显示它们。

到目前为止,我已经尝试了 JSON.stringify 选项,而不是在单独的 &lt;div&gt; 元素中列出每个元素。

function replacer(key, value) {
            // Filtering out properties
            if (value === "null" || value === null) {
              return undefined;
            }
            return value;
          }

JSON.stringify(feature.properties, replacer, "\t").replace(/\"/g, "").replace(/,/g, "") 

这会产生所需的结果,但格式是问题。

即使将 JSON 对象包含在 &lt;pre&gt; 标记中,它也无法在弹出窗口中很好地显示,这会产生:

我想知道是否有解决方案来格式化我的弹出窗口,使其看起来像第一张图片 - 但不包括空值。通过列出所有属性元素(course1course2course3 等...) 没有 产生一堆空的&lt;div&gt;,如何做到这一点是html年代?

【问题讨论】:

  • 这是一个基本的方法:jsfiddle.net/hjyfhm2y
  • 感谢@ChrisG,但我刚刚尝试了该函数,但它仍在产生空值 - 我认为因为空值是带有"null"的字符串
  • 在这种情况下:jsfiddle.net/hjyfhm2y/1
  • 这行得通!例如,如何排除一个名为 field_1 的键或另一个键?你能添加那个更新吗?如果您提交答案,我可以将其标记为正确。谢谢@ChrisG!

标签: javascript html popup mapbox


【解决方案1】:

这是使用经典 Javascript 的一种方式:

var features = {
  properties: {
    city: "Salzburg",
    course1: "DCLead",
    course2: "null",
    course3: null,
    field_1: "Hello"
  }
};

function htmlFromProps(props, exclude) {
  var html = "";
  var i = 0;
  for (p in props) {
    if (props[p] && props[p] != "null" && exclude.indexOf(p) === -1) {
      html += "<div>" + (i === 0 ? "<strong>" : "");
      html += props[p];
      html += (i++ === 0 ? "</strong>" : "") + "</div>\n";
    }
  }
  return html;
}

popup.innerHTML = htmlFromProps(features.properties, ["field_1"]);
#popup {
  width: 80%
}
&lt;textarea id="popup"&gt;&lt;/textarea&gt;

通过调用 .setHTML(htmlFromProps(features.properties, [])) 来使用它,其中第二个参数是要排除的字段数组。

【讨论】:

    【解决方案2】:

    您可以尝试过滤您的属性,请参见下面的示例:

    var feature = {
      properties: {
        city: 'Salzburg',
        course1: 'test',
        course3: 'test3'
      }
    };
    
    var html = Object
      .keys(feature.properties)
      .map(key => feature.properties[key])
      .filter(value => value)
      .map((value, i) => i === 0
          ? `<div><strong>${value}</strong></div>`
          : `<div>${value}</div>`
          )
    
    console.log(html);

    关键部分是.filter(value =&gt; value),其中filter 确保只有真(非空)值保留在数组中。

    【讨论】:

    • 如果你将&lt;strong&gt;添加到第一个&lt;div&gt;,这是完美的答案,假设目标浏览器都支持ES2015。
    • 我将如何将其包装在 .setHTML 中?
    • 我更新了我的答案以包括&lt;strong&gt;。你可以打电话给.setHTML(html)