2

I have an array of objects, each with a reportYear and reportWeek property. Currently, the objects only cover some weeks and years from the beginning date to the end date. How would I insert more objects to fill out the array for the missing weeks?

For example:

Input:

[
  {"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},
]

Output:

[
  {"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},
]
2
  • What?! Please describe step by step what you are doing. Just because it is bold, does not mean that the content is useful. Commented May 8, 2018 at 5:21
  • Sorry,I I just can do it like this:for(var i=0;i<data.length;i++){ importanceList.push(data[i].importanceDegree); if(data[i].reportWeek < 10){ weekList.push(String(data[i].reportYear)+'0'+String(data[i].reportWeek)) }else{ weekList.push(String(data[i].reportYear)+String(data[i].reportWeek)) } }I don't know how to add the discontinuous data. Commented May 8, 2018 at 5:25

1 Answer 1

1

You'll need to go through a loop from your starting reportYear and reportWeek, search for matching items, add an item to the array if it doesn't exist, and then incrementing the week (and year if needed) until you get to the final week and year:

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 version:

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);
Sign up to request clarification or add additional context in comments.

6 Comments

This cpuld also be chained as a.reporterYear - b.reporterYear || a.reporterWeek - b.reporterWeek
@Rhaegal Your question was quite unclear, I misunderstood it. See edit.
@CertainPerformance Sir,can I use 'var' instead of 'let' and 'const'?And '=>' , Is it JS grammar?
@Rhaegal If you're developing in any modern environment, you should use const, let, and other ES6+ syntax, which behaves more predictably than var, but if you can't be bothered to use Babel before you post to production and you need to support ancient browsers, then go ahead and use var and function() { instead of arrow functions. Yes, => is an arrow function.
@CertainPerformance Sir,if I need to use 'var',how to modify your ‘=>’?Can you give me an old version of the code?
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.