Создание массива объектов из большого набора данных JSON - PullRequest
0 голосов
/ 02 июня 2018

Я создаю свое первое более крупное приложение с AngularJS и испытываю трудности с созданием массива объектов для отображения данных.В настоящее время я беру файл Excel и создаю данные JSON с помощью SheetJS.В переменной «jsonData» хранится порядка 40 000 записей в формате:

Console Printout of JSON

Моя конечная цель - составить график «Сумма закрытия» за месяц для каждой авиакомпании.,Моя идея заключается в создании массива объектов, в котором будет храниться название авиакомпании, и массива данных о претензиях (называемых авиакомпанией DataData).У меня возникают трудности с циклическим перемещением по 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:[]},
  {},
  //...
 ]

, поэтому я могу выбрать нужный набор данныхна основе имени, выбранного в раскрывающемся списке.

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Я получил файл excel и не уверен, что это то, что вам нужно, среднее значение и сумма за месяц - это объект с ключами месяца-года.

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 чтобы понять код больше.

Дайте мне знать, если вам нужна помощь

0 голосов
/ 02 июня 2018

Попробуйте следующее:

// 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...