【问题标题】:Generate Table grid with count of repeating items (JSON Data)生成包含重复项计数的表格网格(JSON 数据)
【发布时间】:2021-08-11 22:41:12
【问题描述】:

我需要使用从 Sharepoint Online REST API 服务接收的 JSON 数据构建以下格式的网格表。

需求示例,在 22/05/2021 03:00Z 到 23/05/2021 02:59Z 之间创建的数据应计入 23/05/2021 下显示。

JSON 示例

{
    "d": {
        "results": [
            {
                "__metadNumber": {},
                "Number": 21,
                "Created": "2021-05-21T14:47:55Z"
            },
            {
                "__metadNumber": {},
                "Number": 21,
                "Created": "2021-05-21T13:47:55Z"
            },
            {
                "__metadNumber": {},
                "Number": 28,
                "Created": "2021-05-22T14:48:44Z"
            }
        ],
        "__next": ""
    }
}

所需的表格格式

Number 21/05/2021 22/05/2021
21 (2) (0)
28 (0) (1)

以下代码是我现在所拥有的。问题是,这不会在相应的单元格中填充计数。

    $(function(){
        var requestUri = "SPO_Site/_api/web/lists/getbytitle('List_Name')/items?$top=100&$select=*";
        $.ajax({url: requestUri, type: "GET", headers: {"accept":"application/json; odata=verbose"}, success: onSuccess,});

      function onSuccess(data) {
         var objItems = data.d.results;
         var tableContent;
         var tableRow;
         for (var i = 0; i < objItems.length; i++) {
             tableContent += '<td>' + moment(objItems[i].Created).format("DD/MM/YYYY") + '</td>';
             tableRow += '<tr><td>' + objItems[i].Number + '</td></tr>';
        }
       $('#Date').append(tableContent);
       $('#number').append(tableRow);
       }
    });  

<table id='dateNumber' class="table table-striped table-sm small">
   <tr>
      <td id="Date"></td>
   </tr>
   <tr>
      <td id="number"></td>
   </tr>
</table>

【问题讨论】:

  • 您目前的确切输出是什么,请在此处分享

标签: javascript jquery json html-table sharepoint-online


【解决方案1】:

您可以在 onSuccess 函数中执行以下操作:

var objItems = data.d.results;

var groups = [];
var dates = [];

objItems.forEach(function (item) {
  var number = item.Number;
  var date = moment(item.Created).format("DD/MM/YYYY");

  var group = groups[number] || [];
  var created = group[date] || 0;

  group[date] = created + 1;

  groups[number] = group;

  if (dates.indexOf(date) === -1) {
    dates.push(date);
  }
});

var tableRows = "<tr><td>Number</td>";

dates.forEach(function (date) {
  tableRows += "<td>" + date + "</td>";
});

tableRows += "</tr>";

groups.forEach(function (group, number) {
  tableRows += "<tr><td>" + number + "</td>";

  dates.forEach(function (date) {
    tableRows += "<td>" + (group[date] || 0) + "</td>";
  });

  tableRows += "</tr>";
});

// TODO: append the table rows to the table

这将生成具有所需格式的表格行(带有正确的标题行)。

tableRows 的示例输出:

<tr><td>Number</td><td>21/05/2021</td><td>22/05/2021</td></tr><tr><td>21</td><td>2</td><td>0</td></tr><tr><td>28</td><td>0</td><td>1</td></tr>

这将导致此表: Example output image

【讨论】:

  • 嗨,马蒂亚斯,感谢您的回答。我可以确认这可以计算在 00:00-23:59 之间创建的项目。是否可以修改它以计算在 03:00-02:59 之间创建的条目?请协助。
  • 嗨@JacksonChristopher,从 00:00 到 02:59 的日期算到什么日期?如果他们从以前开始计算日期,您可以简单地从日期中减去 3 小时:var date = new Date(item.Created); date.setHours(date.getHours() - 3);(然后相应地格式化)
  • 我生成的表格将统计从 22/05/2021 03:00Z 到 23/05/2021 02:59Z 创建的条目,并显示在 23/05/2021 下。请使用 moment.js 提供建议。
  • 执行以下操作可以让我根据需要进行计算。但是,由于减法,标题日期显示少 1 天。 var date = moment(item.Created).subtract(7, 'hours').format("DD/MM/YYYY");
  • 如果您想获取日期,例如22/05/2021 3:00 到 23/05/2021 2:59 映射到 23/05/2021 您需要在日期上添加 21 小时(我的错误,抱歉),所以 22/ 05/2021 3:00 将变为 23/05/2021 0:00 和 23/05/2021 2:59 将变为 23/05/2021 23:59。所以它们都映射到 23/05/2021。如果您想将范围添加到标题中,您可以将前一天附加为字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 2021-07-19
  • 1970-01-01
相关资源
最近更新 更多