我有一个来自REST API的报告的JSON提要,类似于:
{
"columns": [
{
"name": "DateAdded"
},
{
"name": "SupportType"
}
...
],
"records": [
[
"2016-07-05",
"Uncategorised"
],
[
"2016-07-05",
"Uncategorised"
],
...
]
}
这个想法是通过仅发送一次列名,然后只发送每行的值数组来大幅节省大型报告的JSON有效负载的大小。
然而,大多数网格,特别是我当前的候选人,DevExpress dxDataGrid,似乎只对更“正确”的JSON感到满意,即每行都有多余的属性名称。
现在我正在寻找一种非常有效的方法来转换传入的JSON以包含属性名称。我的第一个想法是简单地通过索引迭代每一行或值数组,并使用该索引在列数组中查找列/属性名称,并将具有名称/值对的正确JS行对象推送到新数据网格数组。但是,我觉得可能只有一些更有效的方法来转换JSON。
答案 0 :(得分: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);
答案 1 :(得分:0)
我建议在不通过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);