【问题标题】:How to show nested JSON value in table header & row如何在表头和行中显示嵌套的 JSON 值
【发布时间】:2017-11-21 08:15:27
【问题描述】:

我想根据屏幕截图在表头和行中显示嵌套的 JSON 值。

但是,我当前的代码如下所示。

如何获得第一个屏幕截图的结果?

这是我的代码:

var tbl_ss564_ib_jsonData = [
	{
		"S_No": "1",
		"SS564 Metric": "Power Usage Effectiveness(PUE)",
		"Baseline": "2.2*",
		"DC": [	
				{"A": "2.4"},
				{"B": "2.61"},
				{"C": "2.46"},
				{"D": "2.25"},
				{"E": "2.11"},
				{"F": "3.75"},
				{"G": "2.08"},
				{"H": "2.17"},
				{"I": "1.85"},
				{"J": "2.57"},
				{"K": "2.42"}
			]
	}
]
		  
		  var sortAscending = true;
		  var tbl_ss564_ib = d3.select('#ss564_ib_page_wrap').append('table');
		  var title_ss564_ib = d3.keys(tbl_ss564_ib_jsonData[0]);
		  var header_ss564_ib = tbl_ss564_ib.append('thead').append('tr')
		                   .selectAll('th')
		                   .data(title_ss564_ib).enter()
		                   .append('th')
		                   .text(function (d) {
			                    return d;
		                    })
		                   .on('click', function (d) {
		                	   header_ss564_ib.attr('class', 'header');
		                	   
		                	   if (sortAscending) {
		                	     rows.sort(function(a, b) { return b[d] < a[d]; });
		                	     sortAscending = false;
		                	     this.className = 'aes';
		                	   } else {
		                		 rows.sort(function(a, b) { return b[d] > a[d]; });
		                		 sortAscending = true;
		                		 this.className = 'des';
		                	   }
		                	   
		                   });
		  
		  var rows = tbl_ss564_ib.append('tbody').selectAll('tr')
		               .data(tbl_ss564_ib_jsonData).enter()
		               .append('tr');
		  rows.selectAll('td')
		    .data(function (d) {
		    	return title_ss564_ib.map(function (k) {
		    		return { 'value': d[k], 'name': k};
		    	});
		    }).enter()
		    .append('td')
		    .attr('data-th', function (d) {
		    	return d.name;
		    })
		    .text(function (d) {
		    	return d.value;
		    });
* { 
	  margin: 0; 
	  padding: 0; 
     }
   #ss564_ib_page_wrap  body { 
	   font: 14px/1.4 Georgia, Serif; 
     }
    #ss564_ib_page_wrap {
	  margin: 20px;
    }
    p {
	 margin: 20px 0; 
    }

	/* 
	Generic Styling, for Desktops/Laptops 
	*/
	#ss564_ib_page_wrap table { 
		width: 100%; 
		border-collapse: collapse; 
	}
	/* Zebra striping */
	#ss564_ib_page_wrap tr:nth-of-type(odd) { 
		background: #eee; 
	}
	#ss564_ib_page_wrap th { 
		background: Teal;
		font-weight: bold; 
		cursor: s-resize;
		background-repeat: no-repeat;
        background-position: 3% center;
	}
	#ss564_ib_page_wrap	td, th { 
		padding: 6px; 
		border: 1px solid #ccc; 
		text-align: left; 
	}
	
	#ss564_ib_page_wrap	th.des:after {
      content: "\21E9";
    }
    
	#ss564_ib_page_wrap  th.aes:after {
      content: "\21E7";
    }
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
	<div id="ss564_ib_page_wrap">	</div>

【问题讨论】:

    标签: javascript json d3.js


    【解决方案1】:

    在不更改 D3 代码的情况下,最简单的解决方案就是预先操作数据数组:

    tbl_ss564_ib_jsonData[0].DC.forEach(function(d, i) {
        for (var key in d) {
            tbl_ss564_ib_jsonData[0][key] = d[key];
        }
    });
    
    delete tbl_ss564_ib_jsonData[0].DC;
    

    这是您的更改代码:

    var tbl_ss564_ib_jsonData = [{
      "S_No": "1",
      "SS564 Metric": "Power Usage Effectiveness(PUE)",
      "Baseline": "2.2*",
      "DC": [{
          "A": "2.4"
        },
        {
          "B": "2.61"
        },
        {
          "C": "2.46"
        },
        {
          "D": "2.25"
        },
        {
          "E": "2.11"
        },
        {
          "F": "3.75"
        },
        {
          "G": "2.08"
        },
        {
          "H": "2.17"
        },
        {
          "I": "1.85"
        },
        {
          "J": "2.57"
        },
        {
          "K": "2.42"
        }
      ]
    }];
    
    tbl_ss564_ib_jsonData[0].DC.forEach(function(d, i) {
      for (var key in d) {
        tbl_ss564_ib_jsonData[0][key] = d[key];
      }
    });
    
    delete tbl_ss564_ib_jsonData[0].DC;
    
    var sortAscending = true;
    var tbl_ss564_ib = d3.select('#ss564_ib_page_wrap').append('table');
    var title_ss564_ib = d3.keys(tbl_ss564_ib_jsonData[0]);
    var header_ss564_ib = tbl_ss564_ib.append('thead').append('tr')
      .selectAll('th')
      .data(title_ss564_ib).enter()
      .append('th')
      .text(function(d) {
        return d;
      })
      .on('click', function(d) {
        header_ss564_ib.attr('class', 'header');
    
        if (sortAscending) {
          rows.sort(function(a, b) {
            return b[d] < a[d];
          });
          sortAscending = false;
          this.className = 'aes';
        } else {
          rows.sort(function(a, b) {
            return b[d] > a[d];
          });
          sortAscending = true;
          this.className = 'des';
        }
    
      });
    
    var rows = tbl_ss564_ib.append('tbody').selectAll('tr')
      .data(tbl_ss564_ib_jsonData).enter()
      .append('tr');
    rows.selectAll('td')
      .data(function(d) {
        return title_ss564_ib.map(function(k) {
          return {
            'value': d[k],
            'name': k
          };
        });
      }).enter()
      .append('td')
      .attr('data-th', function(d) {
        return d.name;
      })
      .text(function(d) {
        return d.value;
      });
    * {
      margin: 0;
      padding: 0;
    }
    
    #ss564_ib_page_wrap body {
      font: 14px/1.4 Georgia, Serif;
    }
    
    #ss564_ib_page_wrap {
      margin: 20px;
    }
    
    p {
      margin: 20px 0;
    }
    
    
    /* 
    	Generic Styling, for Desktops/Laptops 
    	*/
    
    #ss564_ib_page_wrap table {
      width: 100%;
      border-collapse: collapse;
    }
    
    
    /* Zebra striping */
    
    #ss564_ib_page_wrap tr:nth-of-type(odd) {
      background: #eee;
    }
    
    #ss564_ib_page_wrap th {
      background: Teal;
      font-weight: bold;
      cursor: s-resize;
      background-repeat: no-repeat;
      background-position: 3% center;
    }
    
    #ss564_ib_page_wrap td,
    th {
      padding: 6px;
      border: 1px solid #ccc;
      text-align: left;
    }
    
    #ss564_ib_page_wrap th.des:after {
      content: "\21E9";
    }
    
    #ss564_ib_page_wrap th.aes:after {
      content: "\21E7";
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
    <div id="ss564_ib_page_wrap"> </div>

    【讨论】:

    • 您好,感谢您的热心帮助。这正是我需要的。再次,非常感谢。
    • 您好,很抱歉打扰,当我添加第二行时,该行看不到。非常感谢你的帮助。 snag.gy/ybxBvw.jpg
    • @avamoe 那是因为我的函数处理数据数组就好像它只有一个对象一样。如果您有更多对象,则必须相应更改功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多