按键分组json字符串并添加到数组

时间:2014-02-21 23:26:30

标签: javascript json node.js underscore.js sails.js

我已经在这一段时间了,似乎无法得到这个。我也是javascript的新手。我的目标是创建一个格式为

的数组(或新的javascript对象)
{
  data:{
    [A1:"first column first row", B1:"second column", C1:"third column",...etc],
    [A2:"first column first row", B2:"second column", C2:"third column",...etc],
    [A3:"first column first row", B3:"second column", C3:"third column",...etc],
    [A4:"first column first row", B4:"second column", C4:"third column",...etc],
    [A5:"first column first row", B5:"second column", C5:"third column",...etc]
    }
}

可能与如何使用行和列格式化excel密切相关。我计划使用它来提供handsontable以便客户端操作此数据。

我目前拥有的是

var file = __dirname + '/../../clientFiles/exceltest.json';
fs.readFile(file, 'utf8', function (err, data) {
    if (err) {
        sails.log.error('ERROR: ' + err);
        return;
    }
    data = JSON.parse(data);
    var rows = Object.keys(data);
    rows.forEach(function(column) {
        var items = Object.keys(data[column]);
        items.sort();
        items.forEach(function(item) {
            var value = data[column][item];
            console.log(item+' = '+value);
        });
    });
});

键名永远不会少于2个字符,但可以像excel一样增大(例如A1 => AAA1)。

网页脚本

<div id="dataTable"></div>
<script>
$("#dataTable").handsontable({
    data: <%= data %>,
    startRows: 6,
    startCols: 8,
    rowHeaders: true,
    colHeaders: true,
});
</script>

我被拉出的json格式为

{
"sheet1": {
    "F15": "4,385.97",
    "G15": "910.36",
    "H15": "1,555.36",
    "I15": "373.74",
    "J15": "24.03%",
    "K15": "58.53%",
    "L15": "61",
    "M15": "669",
    "N15": "216665",
    "B16": "01/14/2014",
    "D16": "829",
    "E16": "12,997.13",
    "F16": "531.85",
    "G16": "225.48",
    "H16": "359.21",
    "I16": "80.21",
    "J16": "22.33%",
    "K16": "62.77%",
    "L16": "55",
    "M16": "99",
    "N16": "45384",
    "B17": "01/14/2014",
    "D17": "320",
    "E17": "6,142.45",
    "F17": "1,643.42",
    "G17": "129.76",
    "H17": "215.90",
    "I17": "41.09",
    "J17": "19.03%",
    "K17": "60.10%",
    "L17": "111",
    "M17": "182",
    "N17": "35485",
    "D18": "13478",
    "E18": "94,735.05",
    "F18": "6,663.08",
    "G18": "1,689.97",
    "H18": "3,054.92",
    "I18": "839.16",
    "J18": "27.47%",
    "K18": "55.32%",
    "L18": "29",
    "M18": "996",
    "N18": "396396"
},
"sheet2": {
    "F15": "4,385.97",
    "G15": "910.36",
    "H15": "1,555.36",
    "I15": "373.74",
    "J15": "24.03%",
    "K15": "58.53%",
    "L15": "61",
    "M15": "669",
    "N15": "216665",
    "B16": "01/14/2014",
    "D16": "829",
    "E16": "12,997.13",
    "F16": "531.85",
    "G16": "225.48",
    "H16": "359.21",
    "I16": "80.21",
    "J16": "22.33%",
    "K16": "62.77%",
    "L16": "55",
    "M16": "99",
    "N16": "45384",
    "B17": "01/14/2014",
    "D17": "320",
    "E17": "6,142.45",
    "F17": "1,643.42",
    "G17": "129.76",
    "H17": "215.90",
    "I17": "41.09",
    "J17": "19.03%",
    "K17": "60.10%",
    "L17": "111",
    "M17": "182",
    "N17": "35485",
    "D18": "13478",
    "E18": "94,735.05",
    "F18": "6,663.08",
    "G18": "1,689.97",
    "H18": "3,054.92",
    "I18": "839.16",
    "J18": "27.47%",
    "K18": "55.32%",
    "L18": "29",
    "M18": "996",
    "N18": "396396"
  }
}

我正在为我的框架和引擎使用sails和nodejs。我已经能够对键进行排序,但是对它们进行分组使我望而却步。如果需要,我可以使用下划线。

提前致谢。

1 个答案:

答案 0 :(得分:1)

以下代码将适当地格式化您的JSON,但我不确定您是否希望将所有工作表合并为一个。

更新:使用您提供的格式,JSON将无法与handsontable一起使用。我已将我的解决方案更新为正确的格式,并包含handsontable的集成代码。

更新2 :包含的列定义,以便表格绘制正确。

Live Demo

<强> JS

var sheets = {
"sheet1": {
    "F15": "4,385.97",
    "G15": "910.36",
    "H15": "1,555.36",
    "I15": "373.74",
    "J15": "24.03%",
    "K15": "58.53%",
    "L15": "61",
    "M15": "669",
    "N15": "216665",
    "B16": "01/14/2014",
    "D16": "829",
    "E16": "12,997.13",
    "F16": "531.85",
    "G16": "225.48",
    "H16": "359.21",
    "I16": "80.21",
    "J16": "22.33%",
    "K16": "62.77%",
    "L16": "55",
    "M16": "99",
    "N16": "45384",
    "B17": "01/14/2014",
    "D17": "320",
    "E17": "6,142.45",
    "F17": "1,643.42",
    "G17": "129.76",
    "H17": "215.90",
    "I17": "41.09",
    "J17": "19.03%",
    "K17": "60.10%",
    "L17": "111",
    "M17": "182",
    "N17": "35485",
    "D18": "13478",
    "E18": "94,735.05",
    "F18": "6,663.08",
    "G18": "1,689.97",
    "H18": "3,054.92",
    "I18": "839.16",
    "J18": "27.47%",
    "K18": "55.32%",
    "L18": "29",
    "M18": "996",
    "N18": "396396"
},
"sheet2": {
    "F15": "4,385.97",
    "G15": "910.36",
    "H15": "1,555.36",
    "I15": "373.74",
    "J15": "24.03%",
    "K15": "58.53%",
    "L15": "61",
    "M15": "669",
    "N15": "216665",
    "B16": "01/14/2014",
    "D16": "829",
    "E16": "12,997.13",
    "F16": "531.85",
    "G16": "225.48",
    "H16": "359.21",
    "I16": "80.21",
    "J16": "22.33%",
    "K16": "62.77%",
    "L16": "55",
    "M16": "99",
    "N16": "45384",
    "B17": "01/14/2014",
    "D17": "320",
    "E17": "6,142.45",
    "F17": "1,643.42",
    "G17": "129.76",
    "H17": "215.90",
    "I17": "41.09",
    "J17": "19.03%",
    "K17": "60.10%",
    "L17": "111",
    "M17": "182",
    "N17": "35485",
    "D18": "13478",
    "E18": "94,735.05",
    "F18": "6,663.08",
    "G18": "1,689.97",
    "H18": "3,054.92",
    "I18": "839.16",
    "J18": "27.47%",
    "K18": "55.32%",
    "L18": "29",
    "M18": "996",
    "N18": "396396"
  }
}; 

function processJSON(sheets){
    var data = []; 

    for(var sheet in sheets){
        var curSheet = sheets[sheet];
        var rowData = {}; 
        var curRowNum = -1; 
        var nextRowNum; 
        for(var cell in curSheet){

            nextRowNum = parseInt(cell.replace( /^\D+/g, ''),10); 
            cellLetter = cell.replace(/[0-9]/g, '');
            if(nextRowNum !== curRowNum){
                debugger;
                rowData = {}; 
                data.push(rowData); 
                curRowNum = nextRowNum; 
            }
            rowData[cellLetter] = curSheet[cell];  
        }
    }
    return data; 
}

var data = processJSON(sheets); 

console.log(data); 

$('#example').handsontable({
    data: data,
    minSpareRows:0,
    colHeaders: true,
    contextMenu: true,
    columns: [
        {data: "A"},
        {data: "B"},
        {data: "C"},
        {data: "D"},
        {data: "E"},
        {data: "F"},
        {data: "G"},
        {data: "H"},
        {data: "I"},
        {data: "J"},
        {data: "K"},
        {data: "L"},
        {data: "M"},
        {data: "N"},
        {data: "O"},
        {data: "P"},
        {data: "Q"},
        {data: "R"},
        {data: "S"}
      ]
});


function bindDumpButton() {
    $('body').on('click', 'button[name=dump]', function () {
        var dump = $(this).data('dump');
        var $container = $(dump);
        console.log('data of ' + dump, $container.handsontable('getData'));
    });
}
bindDumpButton();

<强>结果

[
  {
    "F": "4,385.97",
    "G": "910.36",
    "H": "1,555.36",
    "I": "373.74",
    "J": "24.03%",
    "K": "58.53%",
    "L": "61",
    "M": "669",
    "N": "216665"
  },
  {
    "B": "01/14/2014",
    "D": "829",
    "E": "12,997.13",
    "F": "531.85",
    "G": "225.48",
    "H": "359.21",
    "I": "80.21",
    "J": "22.33%",
    "K": "62.77%",
    "L": "55",
    "M": "99",
    "N": "45384"
  },
  {
    "B": "01/14/2014",
    "D": "320",
    "E": "6,142.45",
    "F": "1,643.42",
    "G": "129.76",
    "H": "215.90",
    "I": "41.09",
    "J": "19.03%",
    "K": "60.10%",
    "L": "111",
    "M": "182",
    "N": "35485"
  },
  {
    "D": "13478",
    "E": "94,735.05",
    "F": "6,663.08",
    "G": "1,689.97",
    "H": "3,054.92",
    "I": "839.16",
    "J": "27.47%",
    "K": "55.32%",
    "L": "29",
    "M": "996",
    "N": "396396"
  },
  {
    "F": "4,385.97",
    "G": "910.36",
    "H": "1,555.36",
    "I": "373.74",
    "J": "24.03%",
    "K": "58.53%",
    "L": "61",
    "M": "669",
    "N": "216665"
  },
  {
    "B": "01/14/2014",
    "D": "829",
    "E": "12,997.13",
    "F": "531.85",
    "G": "225.48",
    "H": "359.21",
    "I": "80.21",
    "J": "22.33%",
    "K": "62.77%",
    "L": "55",
    "M": "99",
    "N": "45384"
  },
  {
    "B": "01/14/2014",
    "D": "320",
    "E": "6,142.45",
    "F": "1,643.42",
    "G": "129.76",
    "H": "215.90",
    "I": "41.09",
    "J": "19.03%",
    "K": "60.10%",
    "L": "111",
    "M": "182",
    "N": "35485"
  },
  {
    "D": "13478",
    "E": "94,735.05",
    "F": "6,663.08",
    "G": "1,689.97",
    "H": "3,054.92",
    "I": "839.16",
    "J": "27.47%",
    "K": "55.32%",
    "L": "29",
    "M": "996",
    "N": "396396"
  }
]