2016-07-06 62 views
0

我从一个REST API报告JSON饲料,看起来像:变换JSON无属性名称

{ 
"columns": [ 
    { 
    "name": "DateAdded" 
    }, 
    { 
    "name": "SupportType" 
    } 
    ... 
], 
"records": [ 
    [ 
    "2016-07-05", 
    "Uncategorised" 
    ], 
    [ 
    "2016-07-05", 
    "Uncategorised" 
    ], 
    ... 
] 
} 

这样做是为了实现对JSON有效载荷大报告的规模庞大的储蓄只发送列名一次,然后只是每行的值的数组。

然而,大多数电网,尤其是我目前的人选,DevExpress的dxDataGrid,似乎只有快乐与更“正确”的JSON,即每行有多余的属性名称。

现在我正在寻找一种非常有效的方式来转换传入的JSON以包含属性名称。我的第一个想法是简单地按索引迭代每行或值数组,并使用该索引查找columns数组中的列/属性名称,并将具有名称/值对的正确JS行对象推送到新数据网格阵列。不过,我觉得可能只是一些更有效的方式来转换JSON。

回答

0

您必须遍历每一行才能将其转换为所需的格式。
如果您不想以正确的格式传送数据,则无法解决此问题。

var data = { 
 
    "columns": [ 
 
    { "name": "DateAdded" }, 
 
    { "name": "SupportType" } 
 
    ], 
 
    "records": [ 
 
    [ "2016-07-05", "Uncategorised" ], 
 
    [ "2016-08-06", "Categorised" ] 
 
    ] 
 
}; 
 

 
var transformedData = data.records.map(function(rec, idx) { 
 
    return rec.reduce(function(result, value, idx) { 
 
    result[data.columns[idx].name] = value; 
 
    return result; 
 
    }, {}); 
 
}); 
 

 
console.log(transformedData);

0

我建议使用更straigt前进的方式,而不通过Array#reduce机制移动对象,因为它虽然只有一个对象是分配和返回是没有必要的。

这适用于一个对象,并连续分配Array#forEach的属性,并返回刚刚生成的对象和Array#map用于新数组。

var data = { "columns": [{ "name": "DateAdded" }, { "name": "SupportType" }], "records": [["2016-07-05", "Uncategorised1"], ["2016-08-06", "Categorised2"], ["2016-07-05", "Uncategorised3"], ["2016-08-06", "Categorised4"]] }, 
 
    transformedData = data.records.map(function (a) { 
 
     var o = {}; 
 
     a.forEach(function (b, i) { 
 
      o[data.columns[i].name] = b; 
 
     }); 
 
     return o; 
 
    }); 
 

 
console.log(transformedData);