2016-07-06 58 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);