首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从大型json数据集创建对象数组

从大型json数据集创建对象数组
EN

Stack Overflow用户
提问于 2018-06-03 02:45:42
回答 2查看 187关注 0票数 0

我正在使用AngularJS构建我的第一个较大的应用程序,但在构建用于绘制数据的对象数组时遇到了困难。目前,我正在使用SheetJS创建一个excel文件和JSON数据。有大约40,000个条目存储在变量"jsonData“中,格式如下:

我的最终目标是绘制每个航空公司每月的“收盘价”。我的想法是创建一个存储航空公司名称的对象数组和一个索赔数据数组(称为airlineData)。我很难遍历jsonData,根据if语句将所需的信息添加到对象数组中,以查看该航空公司名称是否已经添加。

我在github- https://github.com/mikebly/tsa-luggage-analysis上有代码

为了简单起见,下面是我在jsonData中的整个循环:

代码语言:javascript
复制
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

我希望得到的结果如下所示:

代码语言:javascript
复制
 [{name:" ",claims:[]},
  {name:" ",claims:[]},
  {},
  //...
 ]

因此,我可以根据通过下拉框选择的名称来选择所需的数据集。

EN

回答 2

Stack Overflow用户

发布于 2018-06-03 05:39:16

我得到了excel文件,不知道这是不是你想要的,average和sum per month是一个以月-年为关键字的对象。

代码语言:javascript
复制
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.reduceArray.prototype.mapObject.keys来更好地理解代码。

如果你需要任何帮助,请告诉我

票数 1
EN

Stack Overflow用户

发布于 2018-06-03 03:32:11

尝试以下操作:

代码语言:javascript
复制
// 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);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50660081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档