将缺失的键,值和数据添加到json对象中

问题描述 投票:1回答:1

我拥有大量的json数据,但是它们会动态变化。每个JSON对象都有一个日期,site_nm和更多值。日期不适合所有日期。此数据集中的不同日期为:2019-10-01,2019-10-02,2019-10-03,2019-10-04,2019-10-05。例如,在此数据集中,这是一个对象,具有:{"site_nm": "GB", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 1}{"site_nm": "GB", "date": "2019-10-03", "sigh": 3, "yo": 1, "wokay": 0},但不具有2019-10-03,2019-10-04,2019-10-05的值。无论如何,是否需要为每个站点添加缺少的日期并将sigh,yo和wokay的值设置为null?

例如,对于站点:GB和日期:2019-10-01,2019-10-02,2019-10-03,2019-10-04,2019-10-05

我是否可以完成每个网站的数据集,看起来类似于:

  • {“ site_nm”:“ GB”,“ date”:“ 2019-10-01”,“ sigh”:1,“ yo”:1,“ wokay”:1}]
  • {“ site_nm”:“ GB”,“ date”:“ 2019-10-02”,“ sigh”:'',“ yo”:'',“ wokay”:``}]
  • {“ site_nm”:“ GB”,“ date”:“ 2019-10-03”,“ sigh”:3,“ yo”:1,1,“ wokay”:0}]
  • {“ site_nm”:“ GB”,“ date”:“ 2019-10-04”,“ sigh”:'',“ yo”:'',“ wokay”:''}
  • {“ site_nm”:“ GB”,“ date”:“ 2019-10-05”,“ sigh”:'',“ yo”:'',“ wokay”:``}]

我能够根据站点名称usinf reduce来分隔值。但是我该如何添加缺少的值?

const comp = (key, order = 'asc') => {
  return function(a, b) {
    if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) {
      return 0;
    }

    const varA = (typeof a[key] === 'string') ?
      a[key].toUpperCase() : a[key];
    const varB = (typeof b[key] === 'string') ?
      b[key].toUpperCase() : b[key];

    let comparison = 0;
    if (varA > varB) {
      comparison = 1;
    } else if (varA < varB) {
      comparison = -1;
    }
    return (
      (order === 'desc') ? (comparison * -1) : comparison
    );
  };
}

const convert_date = function(d) {
  return moment(d.date, 'YYYY-MM-DD').unix() * 1000;
};

let json = [{"site_nm": "gs Universe", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "gs GP", "date": "2019-10-01", "sigh": 4, "yo": 3, "wokay": 2}, {"site_nm": "gs Universe Trailers", "date": "2019-10-01", "sigh": 5, "yo": 5, "wokay": 0}, {"site_nm": "TR", "date": "2019-10-01", "sigh": 4, "yo": 4, "wokay": 0}, {"site_nm": "gs", "date": "2019-10-01", "sigh": 5, "yo": 5, "wokay": 2}, {"site_nm": "GB", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 1}, {"site_nm": "cn", "date": "2019-10-01", "sigh": 4, "yo": 4, "wokay": 1}, {"site_nm": "RS", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "TV", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "ZD", "date": "2019-10-01", "sigh": 2, "yo": 2, "wokay": 0}, {"site_nm": "Car", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "gs Trailers", "date": "2019-10-01", "sigh": 3, "yo": 3, "wokay": 0}, {"site_nm": "gs News", "date": "2019-10-01", "sigh": 3, "yo": 3, "wokay": 0}, {"site_nm": "gs Mobile", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "gs Universe Trailers", "date": "2019-10-02", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "gs GP", "date": "2019-10-04", "sigh": 6, "yo": 6, "wokay": 2}, {"site_nm": "RS", "date": "2019-10-02", "sigh": 2, "yo": 2, "wokay": 0}, {"site_nm": "gs", "date": "2019-10-02", "sigh": 3, "yo": 3, "wokay": 2}, {"site_nm": "TR", "date": "2019-10-02", "sigh": 4, "yo": 3, "wokay": 0}, {"site_nm": "cn Highlights", "date": "2019-10-03", "sigh": 8, "yo": 8, "wokay": 0}, {"site_nm": "gs Universe", "date": "2019-10-02", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "cn en Espa\u00f1ol", "date": "2019-10-02", "sigh": 6, "yo": 6, "wokay": 0}, {"site_nm": "gs Trailers", "date": "2019-10-02", "sigh": 2, "yo": 2, "wokay": 0}, {"site_nm": "ZD", "date": "2019-10-02", "sigh": 4, "yo": 4, "wokay": 1}, {"site_nm": "cn", "date": "2019-10-05", "sigh": 5, "yo": 5, "wokay": 1}, {"site_nm": "TV", "date": "2019-10-02", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "CH", "date": "2019-10-02", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "GB", "date": "2019-10-02", "sigh": 3, "yo": 3, "wokay": 3}, {"site_nm": "DLNow", "date": "2019-10-02", "sigh": 1, "yo": 0, "wokay": 0}, {"site_nm": "gs News", "date": "2019-10-02", "sigh": 2, "yo": 2, "wokay": 0}]

   let sites = [...new Set(json.map(({
        site_nm
      }) => site_nm))].sort();
      let dates = [...new Set(json.map(({
        date
      }) => date))].sort();
//      console.log(dates);
//      console.log(sites);
      $('#sites').text(sites);
      $('#dates').text(dates);

 
    series = sites.reduce((a, c, i) => {
    console.log(a);
      cur_data = json.filter(d => {
        return d.site_nm === c
      }).sort(comp('date'));

      return [...a, {
        name: c.replace(/_/g, ' '),
        data: cur_data.reduce((aa, cc) => {
          return [...aa, {
            x: +convert_date(cc),
            y: +cc.sigh,
            yo: +cc.yo, wokay: +cc.wokay
          }];
        }, [])
      }];
    }, []);
    

  
    
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

<p id='sites'></p>
<p id='dates'></p>
<div id="stuff"></div>
javascript jquery arrays json javascript-objects
1个回答
0
投票

仅提取所有日期,从最低到最高进行迭代,并检查是否存在

for (var date = moment("2019-10-01", "YYYY-MM-DD"); date <= moment("2019-10-05", "YYYY-MM-DD"); date = date.add(1, 'days'))
    console.log(date.format("YYYY-MM-DD"));

var data = [
  {"site_nm": "GB", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 1},
  {"site_nm": "GB", "date": "2019-10-03", "sigh": 3, "yo": 1, "wokay": 0}
];

var existingDates = new Set(data.map(x => x.date));

for (
  var date = moment("2019-10-01", "YYYY-MM-DD"); 
  date <= moment("2019-10-05", "YYYY-MM-DD");
  date = date.add(1, 'days')) {
    var dateFormatted = date.format("YYYY-MM-DD");
    if (!existingDates.has(dateFormatted)) {
      data.push({"site_nm": "GB", "date": dateFormatted, "sigh": "", "yo": "", "wokay": ""});
    }
}

console.log(data.sort((a, b) => moment(a.date, "YYYY-MM-DD") - moment(b.date, "YYYY-MM-DD")));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
© www.soinside.com 2019 - 2024. All rights reserved.