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

时间:2014-03-13 00:08:19

标签: javascript arrays json

我有一个来自API的JSON数组结果以这种形式获取:

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
}]

我尝试使用一些循环变体,但我放弃了。这是我的最后一次fiddle

谢谢大家的提示或答案。

2 个答案:

答案 0 :(得分:1)

您可以使用嵌入式.map() iteratorsArray生成外部metadata,从第3个元素开始,每个namecountry来自{{ 1}}在其中:

resultset

http://jsfiddle.net/n943m/

您还可以先创建空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); country,然后使用迭代器变量查找Array.push()

country

http://jsfiddle.net/krDXV/

要么允许集合调整为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); metadata中包含的列数。

答案 1 :(得分:0)

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

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

  2. 获取所需匹配的collumn索引,以便从结果集中提取数据,并根据这些值创建新对象。

  3. 这是第二种方式的工作示例:

    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/