我有一个来自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。
谢谢大家的提示或答案。
答案 0 :(得分:1)
您可以使用嵌入式.map()
iterators从Array
生成外部metadata
,从第3个元素开始,每个name
和country
来自{{ 1}}在其中:
resultset
您还可以先创建空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
要么允许集合调整为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数据,至少有两种方法:
将每个结果集行转换为具有命名属性的元素,然后转换为您需要的内容。
获取所需匹配的collumn索引,以便从结果集中提取数据,并根据这些值创建新对象。
这是第二种方式的工作示例:
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/