转换没有属性名称的JSON

时间:2016-07-06 04:55:43

标签: javascript arrays json datagrid devexpress

我有一个来自REST API的报告的JSON提要,类似于:

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

这个想法是通过仅发送一次列名,然后只发送每行的值数组来大幅节省大型报告的JSON有效负载的大小。

然而,大多数网格,特别是我当前的候选人,DevExpress dxDataGrid,似乎只对更“正确”的JSON感到满意,即每行都有多余的属性名称。

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

2 个答案:

答案 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);