2016-07-06 5 views
0

у меня есть канал JSON для отчетов с REST API, который выглядит примерно так:Преобразование JSON без имен свойств

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

Идея заключается в том, чтобы достичь огромной экономии на размере JSON полезных данных для больших отчетов отправляя имена столбцов один раз, а затем просто массивы значений для каждой строки.

Однако большинство решеток, особенно мой нынешний кандидат, DevExpress dxDataGrid, похоже, будут довольны более «правильным» JSON, то есть с избыточными именами свойств в каждой строке.

Теперь я ищу очень эффективный способ преобразования входящего JSON для включения имен свойств. Моя первая идея состоит в том, чтобы просто перебирать каждую строку или массив значений по индексу и использовать этот индекс для поиска имени столбца/свойства в массиве столбцов и нажимать соответствующий объект JS row с парами имя/значение на новые данные массив для сетки. Тем не менее, я считаю, что может быть просто более эффективный способ преобразования 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

я предлагаю использовать более подход вперед с прямыми без перемещения объекта через механизм 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);

Смежные вопросы