Javascript JSON数据从表格式转换为JSON?

Javascript JSON数据从表格式转换为JSON?,javascript,json,Javascript,Json,我有以下格式的数据: { "columns": [ { "values": [ { "data": [ "Project Name", "Owner", "Creation Date", "Completed Tasks" ] } ] } ], "rows": [ {

我有以下格式的数据:

{
  "columns": [
    {
      "values": [
        {
          "data": [
            "Project Name",
            "Owner",
            "Creation Date",
            "Completed Tasks"
          ]
        }
      ]
    }
  ],
  "rows": [
    {
      "values": [
        {
          "data": [
            "My Project 1",
            "Franklin",
            "7/1/2015",
            "387"
          ]
        }
      ]
    },
    {
      "values": [
        {
          "data": [
            "My Project 2",
            "Beth",
            "7/12/2015",
            "402"
          ]
        }
      ]
    }
  ]
}
是否有一些超短/简单的方式可以将其格式化为:

{
  "projects": [
    {
      "projectName": "My Project 1",
      "owner": "Franklin",
      "creationDate": "7/1/2015",
      "completedTasks": "387"
    },
    {
      "projectName": "My Project 2",
      "owner": "Beth",
      "creationDate": "7/12/2015",
      "completedTasks": "402"
    }
  ]
}
我已经得到了列名的翻译代码:

r = s.replace(/\%/g, 'Perc')
.replace(/^[0-9A-Z]/g, function (x) {
  return x.toLowerCase();
}).replace(/[\(\)\s]/g, '');

在我用一堆
forEach
循环深入研究这个问题之前,我想知道是否有一种超快速的方法来转换它。我愿意使用下划线之类的库。

没有简单的方法,而且这实际上并不是一个复杂的操作,即使使用for循环也是如此。我不知道你为什么要用正则表达式来做这个

首先,我将把列值读入一个数字索引数组

比如:

var sourceData = JSON.parse(yourJSONstring);
var columns = sourceData.columns[0].values[0].data;
现在,您有了一种方便的方法来开始构建所需的对象。可以使用上面创建的
数组在最终对象中提供属性键标签

var sourceRows = sourceData.rows;
var finalData = {
    "projects": []
};
// iterate through rows and write to object
for (i = 0; i < sourceRows.length; i++) {
    var sourceRow = sourceRows[i].values.data;
    // load data from row in finalData object
    for (j = 0; j < sourceRow.length; j++) {
        finalData.projects[i][columns[j]] = sourceRow[j];
    }
}
var sourceRows=sourceData.rows;
var finalData={
“项目”:[]
};
//遍历行并写入对象
对于(i=0;i
这应该能帮到你。

函数翻译(str){
function translate(str) {
    return str.replace(/\%/g, 'Perc')
        .replace(/^[0-9A-Z]/g, function (x) {
            return x.toLowerCase();
        })
        .replace(/[\(\)\s]/g, '');
}

function newFormat(obj) {

    // grab the column names
    var colNames = obj.columns[0].values[0].data;

    // create a new temporary array
    var out = [];
    var rows = obj.rows;

    // loop over the rows
    rows.forEach(function (row) {
        var record = row.values[0].data;

        // create a new object, loop over the existing array elements
        // and add them to the object using the column names as keys
        var newRec = {};
        for (var i = 0, l = record.length; i < l; i++) {
            newRec[translate(colNames[i])] = record[i];
        }

        // push the new object to the array
        out.push(newRec);
    });

    // return the final object
    return { projects: out };
}
返回str.replace(/\%/g,'Perc') .替换(/^[0-9A-Z]/g,函数(x){ 返回x.toLowerCase(); }) .替换(/[\(\)\s]/g,”); } 函数新格式(obj){ //抓取列名 var colNames=obj.columns[0]。值[0]。数据; //创建一个新的临时数组 var out=[]; 变量行=对象行; //环行 rows.forEach(函数(行){ var记录=行。值[0]。数据; //创建一个新对象,在现有数组元素上循环 //并使用列名作为键将它们添加到对象中 var newRec={}; for(var i=0,l=record.length;i

正则表达式将“This Header Name”这样的名称改为“This Header Name”——更为JSON友好。为什么JSON友好?我喜欢删除空格,因为我正在使用MongoDB。更不用说一些列名在字符串中包含无效字符,例如%和()。还有,命名约定,你知道的。而且,
obj.projectName
obj['Project Name']
更简单。好吧,这是一个命名首选项,与JSON没有任何关系。在这种情况下,只需运行
数组并应用格式化逻辑。我不会进入这里,因为有很多方法可以将任意字符串转换成CAMEL字符串,特别是当你考虑如何处理特殊字符时,Cool,我很感激。你所要做的就是告诉我在两行代码中没有快捷方式或下划线方式我本来打算采取另一种方法。谢谢