【问题标题】:How to group JSON data into week object based on DATE in Node JS/Javascript?如何在 Node JS/Javascript 中根据 DATE 将 JSON 数据分组为周对象?
【发布时间】:2020-12-23 12:23:05
【问题描述】:

我有过去 30 天从 MS SQL 服务器数据库获取的数据,我想使用节点 JS 根据周数对 JSON 对象进行分组。我有以下格式的 JSON 对象

       var data = [{name:"abc",status:"Pending",created_timestamp:"2020-01-12 12:00:12"},
            {name:"abc1",status:"Pending",created_timestamp:"2020-12-12 12:00:12"},
            {name:"abc2",status:"Pending",created_timestamp:"2020-17-12 12:00:12"},
            {name:"abc3",status:"Rejected",created_timestamp:"2020-20-12 12:00:12"},
            {name:"abc4",status:"Rejected",created_timestamp:"2020-22-12 12:00:12"}]

我想得到以下格式的输出:

    var graphDetails = [{Week:1,
                         Pending:1,
                         Rejected:0},
                         {Week:2,
                         Pending:2,
                         Rejected:0}, 
                         {Week:3,
                         Pending:1,
                         Rejected:1}...]

【问题讨论】:

  • 您已在此处标记了 javascript 和 SQL Server;解决后你是什么语言,问题与其他语言有什么关系?
  • 为什么不从数据库中获取星期和年份?

标签: javascript node.js arrays json sql-server


【解决方案1】:
var data = [
  { name: "abc", status: "Pending", created_timestamp: "2020-01-12 12:00:12" },
  { name: "abc1", status: "Pending", created_timestamp: "2020-12-12 12:00:12" },
  { name: "abc2", status: "Pending", created_timestamp: "2020-17-12 12:00:12" },
  {
    name: "abc3",
    status: "Rejected",
    created_timestamp: "2020-20-12 12:00:12",
  },
  {
    name: "abc4",
    status: "Rejected",
    created_timestamp: "2020-22-12 12:00:12",
  },
];

function getWeekNumber(d) {
  // Copy date so don't modify original
  d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));
  // Set to nearest Thursday: current date + 4 - current day number
  // Make Sunday's day number 7
  d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));
  // Get first day of year
  var yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
  // Calculate full weeks to nearest Thursday
  var weekNo = Math.ceil(((d - yearStart) / 86400000 + 1) / 7);
  // Return array of year and week number
  return [d.getUTCFullYear(), weekNo];
}

var updated = {};
data.forEach((element) => {
  let week = getWeekNumber(new Date(element.created_timestamp));
  let weekDetail = updated[week];
  switch (element.status) {
    case "pending":
      weekDetail.pending = weekDetail.pending + 1;
      break;
    default:
      weekDetail.rejected = weekDetail.rejected + 1;
      break;
  }
  updated[week] = {
    week: week,
    pending: weekDetail.pending,
    rejected: weekDetail.rejected,
  };
});

希望这能帮助您解决问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2021-09-12
    • 2016-03-11
    • 2021-12-22
    • 1970-01-01
    • 2021-06-03
    • 2011-05-20
    相关资源
    最近更新 更多