【问题标题】:Group json string by key and add to array按键分组json字符串并添加到数组
【发布时间】:2014-02-21 23:26:29
【问题描述】:

我在这方面已经有一段时间了,但似乎无法理解。我对 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。我已经能够对键进行排序,但是对它们进行分组却让我望而却步。如果需要,我可以使用 underscorejs。

提前致谢。

【问题讨论】:

  • 你在顶部展示的数据结构没有多大意义,你定义一个像哈希一样的数组,然后一个包含数组的哈希......?
  • @htatche 是对的;您显示的结构不是有效的 JSON。此外,目前还不清楚您正在寻找什么样的分组。你在底部粘贴的 JSON 数据被分成了工作表,每个工作表都有相同的行和列,但是你在顶部指定的结构每行有一个数组...
  • 确认:您希望对数据进行分组,以便每一行由一个数组表示,并且该数组中的值表示该行中每一列的值?那么,您希望将所有“A*”键放在同一个数组中,将所有“B*”键放在另一个数组中,等等?
  • @htatche - 我在原始帖子中修复了 json,我输入了错误的字符。
  • @Kyle - 你是对的。我正在用 xlsjs 解析一个 excel 工作簿并创建了上面的 json。键实际上是 excel 字段(例如,a 列,第 1 行)。使用handsontable 我想在页面上显示这个json。问题是动手表需要数组 ([[a1,b1,c1],[a2,b2,c2]]) 和对象 ([{a1:1},{b1:2},{c1 :3}])。以逗号([] 或 {},)分隔的每个数组 [] 或对象 {} 在可动手操作的网格中开始一个新行。

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


【解决方案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"
  }
]

【讨论】:

  • 谢谢!我会深入研究你早上发布的内容。
  • 这非常有效,感谢您让我再次摆脱障碍。在回答您的问题时,我希望将工作表分开并使用它们的名称在可动手操作中进行分页(因此 sheet1 a1 和 sheet 2 a1 不会引起问题),但经过更多研究后,我不认为可动手操作支持任何类似的东西。
  • 我能做的是改变你的循环来拉出工作表名称,将值推送到工作表名称,使其成为每个“工作表”的数组,然后将工作表数组推送到主数组。这会给我 "sheet":{sheet keys} 来使用。这看起来类似于我在上面的 json 中开始的内容,除了重复字段([sheet1, a1] 和 [sheet2, a1])不会导致任何冲突,因为它们将在不同的窗口中呈现。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 2018-01-15
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多