Javascript在另一个结构中重建JSON数组

Javascript rebuild a JSON array in another structure

本文关键字:重建 JSON 数组 结构 另一个 Javascript      更新时间:2023-09-26

我有一个JSON数组结果从API得到在这个形式:

var data = {
"metadata": [{
    "colIndex": 0,
    "colType": "String",
    "colName": "Territory"
}, {
    "colIndex": 1,
    "colType": "String",
    "colName": "Region"
}, {
    "colIndex": 2,
    "colType": "Numeric",
    "colName": "Market"
}, {
    "colIndex": 3,
    "colType": "Numeric",
    "colName": "Sales"
}],
"resultset": [
    ["Europe",    'France',     null,         100],        
    ["Europe",    'Germany',   150,       500],
    ["Europe",    'Austria',   250,       200],
    ["Europe",    'Poland',   220,      100],        
    ["Europe",    'Italy',      120,       200],
    ["Europe",    'Bulgaria',      40,      500],
    ["Europe",    'Romania',      450,      400]
]};

我想把这个数据集转换成另一种结构:

var data = [{
"country": [
    ['France', null],
    ['Germany', 150],
    ['Austria', 250],
    ['Poland', 220],
    ['Italy', 120],
    ['Bulgaria', 40],
    [Romania', 450]
],
"name": "Market" // this is metadata.colName
},{
"country": [
    ['France', 100],
    ['Germany', 500],
    ['Austria', 200],
    ['Poland', 100],
    ['Italy', 200],
    ['Bulgaria', 500],
    [Romania', 400]
],
"name": "Sales" // this is metadata.colName
}]

我尝试使用一些循环变化,但我放弃了。这是我最后一把小提琴。

感谢大家的提示和解答。

您可以使用嵌入式.map()迭代器从metadata生成外部的Array,从第3个元素开始,其中resultset中的每个namecountry:

var countryIndex = 1;
var startingIndex = 2;
// for each desired metadata, generate an object with name and
// a country collection of the respective resultset data
data = data.metadata.slice(startingIndex).map(function (meta) {
    return {
        country: data.resultset.map(function (result) {
            return [
                result[countryIndex],
                result[meta.colIndex]
            ];
        }),
        name: meta.colName
    };
});
console.log(data);
http://jsfiddle.net/n943m/

您也可以先创建空的country Array,然后使用迭代器变量查找country.push()到:

var revised = [];
var countryIndex = 1;
var startingIndex = 2;
var dr = data.resultset;
var dm = data.metadata;
// initialize the name and country objects with an empty Array to fill
for (var j = startingIndex; j < dm.length; j++) {
    revised.push({
        country: [],
        name: dm[j].colName
    });
}
for (var i = 0; i < dr.length; i++) {
    // repeat the same loop used to initialize
    for (var j = startingIndex; j < dm.length; j++) {
        // subtract to start back at `0` for `revised`
        revised[j - startingIndex].country.push([
            dr[i][countryIndex],
            dr[i][ dm[j].colIndex ]
        ]);
    }
}
console.log(revised);
http://jsfiddle.net/krDXV/

应该允许集合调整到metadataresultset中包含的列数

要转换初始ajax数据,至少有两种方法:

  1. 将每个结果集行转换为具有命名属性的元素,然后转换为您需要的元素

  2. 获取从结果集中提取数据所需列的列索引,并根据这些值生成新对象。

下面是第二种方式的工作示例:

var data = {
    "metadata": [{
        "colIndex": 0,
            "colType": "String",
            "colName": "Territory"
    }, {
        "colIndex": 1,
            "colType": "String",
            "colName": "Region"
    }, {
        "colIndex": 2,
            "colType": "Numeric",
            "colName": "Market"
    }, {
        "colIndex": 3,
            "colType": "Numeric",
            "colName": "Sales"
    }],
        "resultset": [
        ["Europe", 'France', null, 100],
        ["Europe", 'Germany', 150, 500],
        ["Europe", 'Austria', 250, 200],
        ["Europe", 'Poland', 220, 100],
        ["Europe", 'Italy', 120, 200],
        ["Europe", 'Bulgaria', 40, 500],
        ["Europe", 'Romania', 450, 400]
    ]
};

var rv = []; //Converted AJAX data.
var m_markets = [];
var m_sales = [];
var ind_region = 1;
var ind_market = 2; //Get index of "Market" collumn
var ind_sales = 3; //Get index of "Sales" collumn
if (Array.isArray(data.resultset)){
    data.resultset.forEach(function(e,i){
        m_markets.push([e[ind_region], e[ind_market]]);
        m_sales.push([e[ind_region], e[ind_sales]]);
    });
}
rv.push({
    country: m_markets,
    name: "Market"
});
rv.push({
    country: m_sales,
    name: "Sales"
});
console.log('Converted JSON: ', rv); // Look at console.

JsFiddle: http://jsfiddle.net/Cmbhx/1/