javascript - 如何将缺失的对象添加到数组中?

标签 javascript jquery ajax

我有一个对象数组,每个对象都有一个 reportYearreportWeek 属性。目前,对象仅涵盖从开始日期到结束日期的几周和几年。我将如何插入更多对象来填充缺失周数的数组?

例如:

输入:

[
  {"reportYear":2017,"reportWeek":49,"employeeCode":100,"employeeName":"Peter","importanceDegree":182.0},
  {"reportYear":2017,"reportWeek":52,"employeeCode":100,"employeeName":"Peter","importanceDegree":77.0},
  {"reportYear":2018,"reportWeek":2,"employeeCode":100,"employeeName":"Peter","importanceDegree":101.0},
]

输出:

[
  {"reportYear":2017,"reportWeek":49,"employeeCode":100,"employeeName":"Peter","importanceDegree":182.0},
  {"reportYear":2017,"reportWeek":50,"employeeCode":100,"employeeName":"Peter","importanceDegree":0},
  {"reportYear":2017,"reportWeek":51,"employeeCode":100,"employeeName":"Peter","importanceDegree":0},
  {"reportYear":2017,"reportWeek":52,"employeeCode":100,"employeeName":"Peter","importanceDegree":77.0},
  {"reportYear":2018,"reportWeek":1,"employeeCode":100,"employeeName":"Peter","importanceDegree":0},
  {"reportYear":2018,"reportWeek":2,"employeeCode":100,"employeeName":"Peter","importanceDegree":101.0},
]

最佳答案

您需要从开始的 reportYearreportWeek 开始循环,搜索匹配的项目,如果项目不存在则将其添加到数组中,然后递增周数(如果需要,还可以递增年数),直到到达最后一周和最后一年:

const data = [
{"reportYear":2017,"reportWeek":49,"employeeCode":100,"employeeName":"Peter","importanceDegree":182.0},
{"reportYear":2017,"reportWeek":51,"employeeCode":100,"employeeName":"Peter","importanceDegree":231.0},
{"reportYear":2017,"reportWeek":52,"employeeCode":100,"employeeName":"Peter","importanceDegree":77.0},
{"reportYear":2018,"reportWeek":1,"employeeCode":100,"employeeName":"Peter","importanceDegree":55.0},
{"reportYear":2018,"reportWeek":2,"employeeCode":100,"employeeName":"Peter","importanceDegree":101.0},
{"reportYear":2018,"reportWeek":3,"employeeCode":100,"employeeName":"Peter","importanceDegree":982.0},
{"reportYear":2018,"reportWeek":4,"employeeCode":100,"employeeName":"Peter","importanceDegree":744.0},
{"reportYear":2018,"reportWeek":8,"employeeCode":100,"employeeName":"Peter","importanceDegree":698.0},
{"reportYear":2018,"reportWeek":9,"employeeCode":100,"employeeName":"Peter","importanceDegree":235.0},
{"reportYear":2018,"reportWeek":12,"employeeCode":100,"employeeName":"Peter","importanceDegree":657.0},
{"reportYear":2018,"reportWeek":13,"employeeCode":100,"employeeName":"Peter","importanceDegree":251.0},
{"reportYear":2018,"reportWeek":14,"employeeCode":100,"employeeName":"Peter","importanceDegree":147.0},
{"reportYear":2018,"reportWeek":15,"employeeCode":100,"employeeName":"Peter","importanceDegree":156.0},
{"reportYear":2018,"reportWeek":19,"employeeCode":100,"employeeName":"Peter","importanceDegree":481.0},
{"reportYear":2018,"reportWeek":20,"employeeCode":100,"employeeName":"Peter","importanceDegree":639.0},
{"reportYear":2018,"reportWeek":21,"employeeCode":100,"employeeName":"Peter","importanceDegree":256.0},
{"reportYear":2018,"reportWeek":30,"employeeCode":100,"employeeName":"Peter","importanceDegree":324.0},
{"reportYear":2018,"reportWeek":31,"employeeCode":100,"employeeName":"Peter","importanceDegree":852.0},
{"reportYear":2019,"reportWeek":3,"employeeCode":100,"employeeName":"Peter","importanceDegree":361.0},
];
let year = 2017;
let week = 49;
while (year !== 2019 || week !== 3) {
  const foundObjectIndex = data.findIndex(
    ({ reportYear, reportWeek }) => reportYear === year && reportWeek === week
  );
  if (foundObjectIndex === -1) {
    data.push({
      reportYear: year,
      reportWeek: week,
      employeeCode: 100,
      employeeName: 'Peter',
      importanceDegree: 0,
    });
  }
  week++;
  if (week === 53) {
    week = 1;
    year++;
  }
}


data.sort((a, b) => {
  if (a.reportYear !== b.reportYear) return a.reportYear - b.reportYear;
  if (a.reportWeek != b.reportWeek) return a.reportWeek - b.reportWeek;
  return b.importanceDegree - a.importanceDegree;
});
console.log(data);

ES5 版本:

var year = 2017;
var week = 49;
while (year !== 2019 || week !== 3) {
  var foundObjectIndex = data.findIndex(function (_ref) {
    var reportYear = _ref.reportYear,
        reportWeek = _ref.reportWeek;
    return reportYear === year && reportWeek === week;
  });
  if (foundObjectIndex === -1) {
    data.push({
      reportYear: year,
      reportWeek: week,
      employeeCode: 100,
      employeeName: 'Peter',
      importanceDegree: 0
    });
  }
  week++;
  if (week === 53) {
    week = 1;
    year++;
  }
}

data.sort(function (a, b) {
  if (a.reportYear !== b.reportYear) return a.reportYear - b.reportYear;
  if (a.reportWeek != b.reportWeek) return a.reportWeek - b.reportWeek;
  return b.importanceDegree - a.importanceDegree;
});
console.log(data);

关于javascript - 如何将缺失的对象添加到数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50226281/

相关文章:

Javascript 即时创建 <div>

javascript - 用惯用的 javascript 编写过滤器

jQuery 如何让 keypress() 监听任何不是您指定的按键

javascript - JQuery Mobile 在离开时不会更新或重新发布数据

javascript - 动态加载带有选项卡的表单

javascript - 从 $.when .done 之外的 ajax 添加对象

底部页脚的 css 布局,动态 ajax 内容更改页面高度

滚动到末尾的 Javascript

javascript - Jquery:无限循环和暂停

javascript - "No ' Access-Control-Allow-Origin POST请求成功后抛出' header is present on the requested resource"错误