转换 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);
我有一个来自 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);