【问题标题】:Merge two HTML tables using Javascript Objects as data feed?使用 Javascript 对象作为数据馈送合并两个 HTML 表?
【发布时间】:2015-11-03 17:48:47
【问题描述】:

我将有多个数组数组,我想从数组中创建对象,然后将其合并到一个表中。我已经这样做了,但是我需要帮助使用该对象来制作一张更大的桌子吗?

如果键存在于一个对象中但不存在于其他对象中,则该键不存在的对象的值可以为空。我可以制作多个不同的表格,但是如何合并它们以使表格变大?

var data  =[["default_PROJECT","Allow","Connect","Allow","AddComment","Allow","Write",
"Allow","ViewComments","Allow","ExportData","Allow","ExportImage","Allow","ViewUnderlyingData","Allow","Read","Allow","ShareView","Allow","Filter"],
["Allow","ExportImage","Allow","Write","Allow","ViewComments",
"Allow","ShareView","Allow","Filter","Allow","ExportData","Allow","Connect","Allow",
"Read","Allow","ViewUnderlyingData","Allow","AddComment","Allow","ViewComments","Deny","ExportData","Allow",
"AddComment","Deny","Write","Allow","Read","Deny","ExportXml","Deny","ShareView","Allow","Connect","Allow","ChangeHierarchy","Allow",
"WebAuthoring","Deny","ViewUnderlyingData","Deny","Filter","Deny","ExportImage"]];
  			 var result = [];
		 for(var i = 0, len = data.length; i < len; i++) {
		   var list = data[i];
		   
		   result[i] = { name: list[0] };

		  for (var j = list.length - 1; j >= 1; j = j - 2) {
		     var key = list[j];
		     var value = list[j - 1];
		     if( result[i][key] !== "Deny" ) {
		         result[i][key] = value;
		     }
		 }
		 }
		 console.log(result);
		 var resultElement = document.getElementById('result1');
		 var tpl = '';
		 for(var t = 0, tLen = result.length; t < tLen; t++) {
		   var item = result[t];
		   
		   tpl+= '<table align=center style="width:25%;">' +
		     '<thead>' +
		       '<tr><td colspan="2">Project: ' + item.name + '</td></tr>' +
		       '<tr><th>Permission</th><th>Value</th></tr>' +
		       '</thead>' +
		     '<tbody>'
		   ;
		   
		   for(var key in item) {
		     if(!item.hasOwnProperty(key) || key === 'name') { continue; }
		     if(item[key] == "Allow"){
			     tpl += '<tr style="background-color:greenyellow;"><td>'+ key +'</td><td>'+ item[key] +'</td></tr>';   
		     }
		     else{
			     tpl += '<tr style="background-color:red;"><td>'+ key +'</td><td>'+ item[key] +'</td></tr>';   
		     }
		   }
		 }
		 resultElement.innerHTML = tpl;
table { text-align: left; width: 100%; margin-bottom: 50px; border-collapse: collapse;}
td, th { width: 50%; border: 1px solid black; line-height: 1; padding:2px 10px;}
[colspan="2"] { color: blue; font-weight: bolder;text-transform: uppercase; text-align: center;}
&lt;div id="result1"&gt;&lt;/div&gt;

http://jsfiddle.net/h2s17hac/

【问题讨论】:

  • 你能用你的 desired 结果的 HTML 模型创建另一个 jsfiddle。目前,尚不清楚您希望最终合并的表格是什么样子。
  • @AndyNoelker 是的,抱歉正在处理小提琴和更新.. jsfiddle.net/h2s17hac/4
  • @AndyNoelker 我也在尝试对每个对象的键进行排序以使键相互对齐,这就是我真正想要的。
  • 我尝试了我认为你想要的东西。如果这不是我们想要的结果,请告诉我。

标签: javascript html css object


【解决方案1】:

这会合并两个表。

Fiddle

var data  =[["default_PROJECT","Allow","Connect","Allow","AddComment","Allow","Write",
"Allow","ViewComments","Allow","ExportData","Allow","ExportImage","Allow","ViewUnderlyingData","Allow","Read","Allow","ShareView","Allow","Filter"],
["test_PROJECT", "Allow","ExportImage","Allow","Write","Allow","ViewComments",
"Allow","ShareView","Allow","Filter","Allow","ExportData","Allow","Connect","Allow",
"Read","Allow","ViewUnderlyingData","Allow","AddComment","Allow","ViewComments","Deny","ExportData","Allow",
"AddComment","Deny","Write","Allow","Read","Deny","ExportXml","Deny","ShareView","Allow","Connect","Allow","ChangeHierarchy","Allow",
"WebAuthoring","Deny","ViewUnderlyingData","Deny","Filter","Deny","ExportImage"]];

function makeObjects(data){
   			 result = [];
    		 for(var i = 0, len = data.length; i < len; i++) {
			   var list = data[i];
			   result[i] = { Name: list[0] };
			  for (var j = list.length - 1; j >= 1; j = j - 2) {
			     var key = list[j];
			     var value = list[j - 1];
			     if( result[i][key] !== "Deny" ) {
			         result[i][key] = value;
			     }
			 }
		}
    return result;
}

function sortObject(obj) {
    return Object.keys(obj).sort().reduce(function (result, key) {
        result[key] = obj[key];
        return result;
    }, {});
}

function getKeys(data){
    var keys = [];
   for(i=0; i<data.length; i++){
       key = Object.keys(data[i]);
      for(j =0; j<key.length; j++){
          if(keys.indexOf(key[j]) == -1){
           keys.push(key[j]);   
          }
       }
   }
    return keys;
}

function addMissingKeys(keys, data){
    var filtData = [];
    for(i=0; i<data.length; i++){
        for(j=0; j<keys.length; j++){
         if(data[i][keys[j]] == undefined){
          data[i][keys[j]] = "";  
         }
        }
    }
    for(num=0; num<data.length; num++){
        filtData.push(sortObject(data[num]));
    }
	return filtData;
}

var dataa = makeObjects(data);
var keys = getKeys(dataa);
var filtData = addMissingKeys(keys, dataa);
console.log(filtData);
			 var resultElement = document.getElementById('result1');
			 var tpl = '<table align=center style="width:75%;">';
			 for(var t = 0, tLen = filtData.length; t < tLen; t++) {
			   var item = filtData[t];
                 
			   tpl+= '<tr><td>' + item.Name + '</td>';
			   
			   for(var key in item) {
			     if(!item.hasOwnProperty(key) || key === 'Name') { continue; }
                   if(item[key] != "") {
                     if(item[key] == "Allow"){
                         tpl += '<td style="background-color:greenyellow;">'+ key +':<br>'+ item[key] +'</td>';   
                     }
                     else{
                         tpl += '<td style="background-color:red;">'+ key +':<br>'+ item[key] +'</td>';   
                     }
                   } else {
                   		tpl += '<td></td>';
                   }
                 
			   }
               tpl += '</tr>';
			 }
             tpl += '</table>';
			 resultElement.innerHTML = tpl;
table { text-align: left; width: 100%; margin-bottom: 50px; border-collapse: collapse;}
td, th { width: 50%; border: 1px solid black; line-height: 1; padding:2px 10px;}
[colspan="2"] { color: blue; font-weight: bolder;text-transform: uppercase; text-align: center;}
<div id="result1"></div>
<div id="test"></div>

【讨论】:

  • Ehhh,我想把它做成一张桌子,见底部。每个项目都有一行,然后是权限。我需要他们的钥匙排成一行,如果没有钥匙那么单元格应该是空白的?
  • 啊,好吧,我明白你的意思了。给我一点,我会更新我的答案。
  • 谢谢,不胜感激。我也在研究另一个小提琴来帮助改进它。完成后我会分享。
  • 这可能会有所帮助:jsfiddle.net/h2s17hac/5 我更改了它,因此我对每个对象进行了排序,然后如果对象没有该键,则将键添加为空值。这样以表格格式存储会更容易。谢谢。
  • 是的,第二把小提琴绝对是正确的前进方向。我编辑了我的答案,它现在可以按您的意愿工作。
猜你喜欢
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
相关资源
最近更新 更多