转换 JSON 没有 属性 个名字

Transform JSON without property names

我有一个来自 REST API 的报告的 JSON 提要,看起来像:

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

我们的想法是通过只发送一次列名,然后只发送每行的值数组,从而大大节省大型报告的 JSON 有效负载的大小。

然而,大多数网格,尤其是我目前的候选人 DevExpress dxDataGrid,似乎只对更多 'correct' JSON,即冗余 属性 名称感到满意每行。

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

您必须遍历每一行以将其转换为所需的格式。
如果您不想交付已采用正确格式的数据,那就别无选择。

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

我建议使用更直接的方法,而不是通过 Array#reduce 的机制移动对象,因为没有必要,而只有一个对象要分配给 return。

这在对象内部起作用,并使用 Array#forEach and returns the just generated object with 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);