Как я могу сгруппировать данные JSON и посчитать по элементам месяца, используя Nunjucks или Node.JS - PullRequest
0 голосов
/ 24 сентября 2018

Учитывая эти данные в качестве примера, это всего лишь 2 записи, сотни за несколько месяцев

{
 "responses": [{
    "responseid": 1,
    "q1": 1,
    "q2": 1,
    "q3": 1,
    "q4": 1,
    "q5": 2,
    "response": "Response 1 example feedback",
    "date": "2018-02-12T00:00:00"
  },
  {
    "responseid": 2,
    "q1": 1,
    "q2": 2,
    "q3": 1,
    "q4": 1,
    "q5": 1,
    "response": "Response 2 example feedback",
    "date": "2018-03-15T00:00:00"
  },
  {
    "responseid": 3,
    "q1": 1,
    "q2": 2,
    "q3": 1,
    "q4": 1,
    "q5": 1,
    "response": "Response 3 example feedback",
    "date": "2018-04-15T00:00:00"
  },
  {
    "responseid": 4,
    "q1": 1,
    "q2": 2,
    "q3": 1,
    "q4": 1,
    "q5": 1,
    "response": "Response 4 example feedback",
    "date": "2018-04-15T00:00:00"
  }]
}

Как сгруппировать данные по месяцам, чтобы я мог отобразить количество записей влюбой данный месяц.Итак, 4 ответа выше, 2 с 1 апреля, каждый с февраля и марта

1 февраля

1 марта

2 апреля

Яиспользуя Node и Nunjucks.

Хотя я бы добавил, я могу сгруппировать записи по дате в качестве отправной точки.

{% for date, items in servicedata.responses | groupby("date") %}
    <b>{{ date }}</b> :
    {{items.length}}<br>
{% endfor %}

Ответы [ 4 ]

0 голосов
/ 25 сентября 2018

Не похоже, что groupby поддерживает пользовательские выражения, но вы можете добавить месяц, используя JavaScript:

servicedata.responses.forEach(obj => obj.month = obj.date.slice(5, 7));

, а затем сгруппировать по нему:

{% for month, items in servicedata.responses | groupby("month") %}
0 голосов
/ 24 сентября 2018

Возможно, это не самое чистое решение, но оно подойдет.

var yourJson = {"responses":[{"date":"2018-02-12T00:00:00"},{"date":"2018-03-15T00:00:00"},{"date":"2018-04-15T00:00:00"},{"date":"2018-04-15T00:00:00"}]};

function mix() {
  var counts={};

  yourJson.responses.forEach(element => {
    var mydate = (new Date(element.date)).toLocaleString("en-us", {
      month: "long"
    });
    counts[mydate] = counts[mydate] ? ++counts[mydate] : 1;  
  });
  
  for (var key in counts) {
    document.write(key + ' ' + counts[key] + '<br>');
  }
}

mix();
0 голосов
/ 24 сентября 2018

Аналогично, но без необходимости импортировать момент.Сначала подготовьте объект результата, затем переберите все объекты в ответе и найдите месяц.

res={'01':0,'02':0,'03':0,'04':0,'05':0,'06':0,'07':0,'08':0,'09':0,'10':0,'11':0,'12':0,}

data.responses.forEach(obj=>{
    res[obj.date.split('-')[1]]+=1
})
console.log(res)
0 голосов
/ 24 сентября 2018

Простой счет:

const moment = require('moment');

let res = {};    

data.responses.forEach(item => {
    let month = moment(item.date).startOf('month');
    res[month] = res[month] || 0;
    res[month]++;
});

console.log(res);
/* 'Thu Feb 01 2018 00:00:00 GMT+0300': 1,
   'Thu Mar 01 2018 00:00:00 GMT+0300': 1,
   'Sun Apr 01 2018 00:00:00 GMT+0300': 2 */

Группировка:

const moment = require('moment');

let res = {};  

data.responses.forEach(item => {
    let month = moment(item.date).startOf('month');
    res[month] = res[month] || { count: 0, responses: [] };
    res[month].count++;
    res[month].responses.push(item);
});

console.log(res)
...