Я хочу превратить массив javascript для создания нового массива

#javascript

#javascript

Вопрос:

Я хочу отобразить график общего количества для GroupA и GroupB за каждый месяц.
Библиотека graph использует chart.js Я хочу поместить сумму подсчетов за каждый месяц в data:[].
Я хочу превратить массив значений, извлекаемых из данных, для определения GroupA и GroupB, и поместить количество за каждый месяц в данные

   script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"
  javascript:
    var users = #{raw @user_counts.to_json}
    console.log(users)
    var ct = document.getElementById('ex_chart');
    var ex_chart = new Chart(ct, {
        type: 'horizontalBar',
        data: {
        labels: ["Jan", "Feb", "Mar", "Apr", "May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],
          datasets: [
            {
              label: 'groupA',
              data: [],
              backgroundColor: '#C7CED7'
            },
            {
              label: 'groupB',
              data: [],
              backgroundColor: '#0068B4'
            }
          ]
        },
        options: options
    })
 

Содержимое пользователей

 [
  {
    activity_type: "groupA"
    count: 10
    created_at: "2021-01-14T13:46:18.000Z"
    id: 1
    year: 2020
    month: "Jan"
    updated_at: "2021-01-14T13:46:18.000Z"
  },
  {
    activity_type: "groupA"
    count: 8
    created_at: "2021-01-14T13:46:18.000Z"
    id: 2
    year: 2020
    month: "Feb"
    updated_at: "2021-01-14T13:46:18.000Z"

  },
  {
    activity_type: "groupB"
    count: 8
    created_at: "2021-01-14T13:46:18.000Z"
    id: 3
    year: 2020
    month: "Feb"
    updated_at: "2021-01-14T13:46:18.000Z"

  }
]
 

Ответ №1:

С технической точки зрения, вы хотите сгруппировать количество пользователей по двум параметрам: «activityType» и «месяц».

Ниже приведено решение с использованием функционального программирования. Вы можете изменить keys , например, добавить параметр ‘year’, что на самом деле имеет смысл.

 const users = [
  {
    activity_type: "groupA",
    count: 10,
    year: 2020,
    month: 1
  },
  {
    activity_type: "groupA",
    count: 17,
    year: 2019,
    month: 2,
  },
  {
    activity_type: "groupA",
    count: 8,
    year: 2020,
    month: 2,
  },
  {
    activity_type: "groupB",
    count: 8,
    year: 2020,
    month: 1,
  }
];

const keys = ['activity_type', 'month'];
function matches(table, entry, keys) { // finds item with same values
  return table.find(e => keys.every(k => e[k] == entry[k]));
}
const usersGroupedByKeys = users.reduce((cur, val) => {
  let alreadyIn = matches(cur, val, keys);
  if (alreadyIn) {
    alreadyIn['count'] = alreadyIn['count']   val['count'];
  } else {
    cur.push(val);
  }
  return cur;
}, []);
console.log(usersGroupedByKeys); 

Проверьте документы.

Комментарии:

1. Будет отображено общее количество для GroupA и общее количество для GroupB. Я хочу создавать данные для каждого месяца.

2. Итак, в итоге у вас есть: { «GroupA»: 18, «GroupB»: 8 } . Разве это не то, что вы хотели?

3. Разделите на GroupA и GroupB. После этого я хочу разделить на месяц.

4. Когда группа одинакова и в том же месяце, я хочу суммировать количество.

5. Я обновил свой ответ в соответствии с вашими требованиями. Я думаю, вам также следует сгруппировать по годам, что я и рассматривал.