我正在使用AngularJS构建我的第一个较大的应用程序,但在构建用于绘制数据的对象数组时遇到了困难。目前,我正在使用SheetJS创建一个excel文件和JSON数据。有大约40,000个条目存储在变量"jsonData“中,格式如下:
我的最终目标是绘制每个航空公司每月的“收盘价”。我的想法是创建一个存储航空公司名称的对象数组和一个索赔数据数组(称为airlineData)。我很难遍历jsonData,根据if语句将所需的信息添加到对象数组中,以查看该航空公司名称是否已经添加。
我在github- https://github.com/mikebly/tsa-luggage-analysis上有代码
为了简单起见,下面是我在jsonData中的整个循环:
for(i = 0; i < jsonData.length; i++){
var date = XLSX.SSF.parse_date_code(jsonData[i]["Incident Date"],{date1904:false});
var month = date.m; // Returns 1,2,3,...,12
var airport = String(jsonData[i]["Airport Code"]);
var airline = String(jsonData[i]["Airline Name"]);
var claim = Number(jsonData[i]["Close Amount"]);
claim = claim || 0; // Convert "-" to 0 for summing and average
claimTotal += claim;
// Build airport data array of objects to keep track of each airline's individual claims
if(airlineData.includes(airline) == false){
airlineData.name = airline;
airlineData.claimTotal = claim;
} else{
continue;
}
// Build airline name array for dropdown box
if (airlineNames.includes(airline) === false){
airlineNames.push(airline);
} else{
continue;
}
// Build airport code array for dropdown box
if (airportCodes.includes(airport) === false){
airportCodes.push(airport);
} else{
continue;
}
}; // End loop through rows
我希望得到的结果如下所示:
[{name:" ",claims:[]},
{name:" ",claims:[]},
{},
//...
]
因此,我可以根据通过下拉框选择的名称来选择所需的数据集。
发布于 2018-06-03 05:39:16
我得到了excel文件,不知道这是不是你想要的,average和sum per month是一个以月-年为关键字的对象。
const dataPromise = fetch("https://raw.githubusercontent.com/amsterdamharu/amsterdamharu.github.io/master/data.txt")
.then(response=>response.text())
.then(
text=>{
const all = text.split("\n").map(row=>row.trim());
const fields = all[0].split("\t").map(f=>f.trim());
const info = all.slice(1).map(
row=>row.split("\t").map(item=>item.trim())
);
return info.map(
(row)=>
row.reduce(
(result,field,index)=>{
result[fields[index]]=field;
return result;
},
{}
)
);
}
);
dataPromise.then(
data=>{
const raw = data.reduce(
(result,item)=>{
const name = item["Airline Name"];
const claims = (result[name] = (result[name] || {}));
const date = new Date(item["Incident Date"]);
const month = date.getMonth()+1;
const year = date.getFullYear();
const claim = Number(item["Close Amount"].replace(/[^0-9\.]/g,""));
if(isNaN(claim)){
debugger;
}
claims[`${month}-${year}`]=claims[`${month}-${year}`]||[];
claims[`${month}-${year}`].push(claim);
return result;
},
{}
);
console.log("raw object:",raw);
const objectAveragePerMonth = Object.keys(raw).map(
name=>({
name,
monthAverage:Object.entries(raw[name]).reduce(
(result,[key,values])=>{
const noZeros = values.filter(m=>m);//remove zero values
result[key] = (noZeros.length)
? noZeros.reduce((sum,item)=>sum+item,0)/noZeros.length
: 0;
return result;
},
{}
)
})
);
console.log("average per month:",objectAveragePerMonth);
const objectSumPerMonth = Object.keys(raw).map(
name=>({
name,
totalPerMonth:Object.entries(raw[name]).reduce(
(result,[key,values])=>{
result[key] = values.reduce((sum,item)=>sum+item,0);
return result;
},
{}
)
})
);
console.log("sum per month",objectSumPerMonth);
const objectTotal = Object.keys(raw).map(
name=>({
name,
total:Object.entries(raw[name]).reduce(
(result,[key,values])=>result+values.reduce((sum,item)=>sum+item,0),
0
)
})
);
console.log("total per airline",objectTotal);
}
);
您可以查看Array.prototype.reduce、Array.prototype.map和Object.keys来更好地理解代码。
如果你需要任何帮助,请告诉我
发布于 2018-06-03 03:32:11
尝试以下操作:
// Code goes here
var jsonData = [{
"Airline Name":"American Airlines ",
"Airport Code":"ORD",
"Airport Name":"Chicago O'Hare International Airport",
"Claim Number":2010030168888,
"Claim Site":"Checked Baggage",
"Claim Type":"Passenger Property Loss",
"Close Amount":0,
"Date Received":40231,
"Disposition":"Deny",
"Incident Date":40182.25,
"Item Category":"Personal Electronics; Travel Accessories"
}];
var map = {};
jsonData.forEach(function(obj){
if(!map[obj["Airline Name"]])
map[obj["Airline Name"]] = {};
map[obj["Airline Name"]].name = obj["Airline Name"];
map[obj["Airline Name"]].claims = map[obj["Airline Name"]].claims || [];
map[obj["Airline Name"]].claims.push(obj["Claim Number"]);
map[obj["Airline Name"]].claimTotal = map[obj["Airline Name"]].claimTotal !== undefined ? map[obj["Airline Name"]].claimTotal + obj["Close Amount"] : 0;
});
var arr = Object.values(map);
console.log(arr);
https://stackoverflow.com/questions/50660081
复制相似问题