简体   繁体   中英

Generate table from an array Data

I have got some data like below

 var data = [ [21, [1,2] ], [22, [1,2] ] ];
 var const = [-1 , 0 , 1];

My requirement is to generate a table with below structure

 21, 22 are main column headers
 1, 2 are nested columns under 21, 22

For each 1,2 of 21, 22 I need to add const value as nested column headers So in above case
21, 22 are main column headers, 1,2 will be nested columns under each 21, 22 const value -1, 0, 1 will be nested column headers under each 1, 2 of 21, 22 I have written the below code. But that is not working as expected

function simplifyCols(obj) {
    var reform = {
        table : {}
    };
    for (var x = 0; x < obj.length; x++) {
        obj[x].push( const );
    }
    for(var i = 0, l = obj.length; i < l; i++){
        var key = obj[i];
        for (var j = 0, m = key.length; j < m; j++) {
            var colspan = 1;
            for (var k = j + 1; k < m; k++) {
                colspan *= key[k].length; 
            }
            reform.table[j] = reform.table[j] || [];
            reform.table[j].push({
                span : colspan,
                data : key[j]
            });
        }
    }
    return reform;
}
var cols = simplifyCols( data ).table;
var keys = Object.keys(cols).sort(function(a, b){
    return a - b;
});
var table = document.createElement('table');
document.body.appendChild(table);
for (var i = 0, l = keys.length; i < l; i++) {
    var keyData = cols[keys[i]], tr = document.createElement('tr');
    table.appendChild(tr);
    for (var j = 0, m = keyData.length; j < m; j++) {
        var eleData = keyData[j].data;
        if(eleData instanceof Array){
            for (var k = 0, n = eleData.length; k < n; k++) {
                var td = document.createElement('td');
                td.innerHTML = eleData[k];
                td.colSpan = keyData[j].span;
                tr.appendChild(td);
            }
        }else{
            var td = document.createElement('td');
            td.innerHTML = keyData[j].data;
            td.colSpan = keyData[j].span;
            tr.appendChild(td);
        }
    }
    table.appendChild(tr);
}
document.body.appendChild(table);

Please help to improve the logic and also make it work. I am struck in the middle and could not proceed further

Here is the HTML I am expecting from above

fiddle here http://jsfiddle.net/4NS8d/

 <table>
    <tr> <td colspan="6">21</td> <td colspan="6">21</td> </tr>
    <tr> <td colspan="3">1</td> <td colspan="3">2</td> <td colspan="3">1</td> <td colspan="3">2</td> </tr>
    <tr> <td>-1</td> <td>0</td> <td>1</td><td>-1</td> <td>0</td> <td>1</td><td>-1</td> <td>0</td> <td>1</td><td>-1</td> <td>0</td> <td>1</td></tr>
 </table>

First of all you can not name var const.

Try this:

var const2 = [-1 , 0 , 1];
function simplifyCols(obj) {
    var reform = {
        table : {}
    };
    for (var x = 0; x < obj.length; x++) {
        obj[x].push( const2 );
    }
    for(var i = 0, l = obj.length; i < l; i++){
        var key = obj[i];
        for (var j = 0, m = key.length; j < m; j++) {
            var colspan = 1;
            for (var k = j + 1; k < m; k++) {
                colspan *= key[k].length; 
            }
            reform.table[j] = reform.table[j] || [];
            reform.table[j].push({
                span : colspan,
                data : key[j]
            });
        }
    }
    return reform;
}
var data = [ [21, [1,2] ], [22, [1,2] ] ];
var cols = simplifyCols(data).table;
var keys = Object.keys(cols).sort(function(a, b){
    return a - b;
});
var table = document.createElement('table');
document.body.appendChild(table);
for (var i = 0, l = keys.length; i < l; i++) {
    var keyData = cols[keys[i]], tr = document.createElement('tr');
    table.appendChild(tr);
    for (var j = 0, m = keyData.length; j < m; j++) {
        var eleData = keyData[j].data;
        if(eleData instanceof Array){
            for (var k = 0, n = eleData.length; k < n; k++) {
                var td = document.createElement('td');
                td.innerHTML = eleData[k];
                td.colSpan = keyData[j].span;
                tr.appendChild(td);
            }
        }else{
            var td = document.createElement('td');
            td.innerHTML = keyData[j].data;
            td.colSpan = keyData[j].span;
            tr.appendChild(td);
        }
    }
    table.appendChild(tr);
}
document.body.appendChild(table);

http://jsfiddle.net/zxvnp/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM