Как сгруппировать массив данных с датой от Ajax Ответ? - PullRequest
0 голосов
/ 31 марта 2020

У меня есть такие данные массива

[{ 
   date: "January 2019",
   sum: 20,
   name: "Persada",
},{ 
   date: "Februay 2019",
   sum: 21,
   name: "Persada",
},{ 
   date: "April 2019",
   sum: 22,
   name: "Persada",
},{ 
   date: "January 2019",
   sum: 10,
   name: "Kharisma",
},{ 
   date: "March 2019",
   sum: 5,
   name: "Kharisma",
},{ 
   date: "Februari 2019",
   sum: 4,
   name: "Solusindo",
},{ 
   date: "Mai 2019",
   sum: 2,
   name: "Solusindo",
}]

Из приведенных выше данных я выбрал другую дату. поэтому я получаю такую ​​дату

["January 2019", "February 2019", "March 2019", "April 2019", "Mai 2019"]

, а затем я хочу установить такие данные

[{
   date : ["January 2019", "February 2019", "March 2019", "April 2019", "Mai 2019"],
   sum: [20, 21, 0, 22, 0],
   name: "Persada",
},{
   date : ["January 2019", "February 2019", "March 2019", "April 2019", "Mai 2019"],
   sum: [0, 0, 10, 5, 0],
   name: "Kharisma",
},{
   date : ["January 2019", "February 2019", "March 2019", "April 2019", "Mai 2019"],
   sum: [0, 4, 0, 0, 2],
   name: "Solusindo",
}]

, если на эту дату нет данных, тогда сумма данных будет автоматически заменено на 0. Пожалуйста, помогите мне установить такие данные. спасибо

Ответы [ 2 ]

1 голос
/ 31 марта 2020
  1. извлечение уникальных дат из ответа (используется Set, Array.from для создания начальных записей)
  2. создание словаря из записей начальной даты (используется Object.entries для создания массива формы словаря)
  3. с использованием Array.prototype.reduce создать словарь date and sum с name в качестве ключа
  4. , использовавший Object.entries до l oop через словарь для создания набора результатов.
  5. используется Object.keys для извлечения dates из словаря дат
  6. используется Object.values для извлечения sum из словаря дат

const response = [{
  date: "January 2019",
  sum: 20,
  name: "Persada",
}, {
  date: "Februay 2019",
  sum: 21,
  name: "Persada",
}, {
  date: "April 2019",
  sum: 22,
  name: "Persada",
}, {
  date: "January 2019",
  sum: 10,
  name: "Kharisma",
}, {
  date: "March 2019",
  sum: 5,
  name: "Kharisma",
}, {
  date: "Februari 2019",
  sum: 4,
  name: "Solusindo",
}, {
  date: "Mai 2019",
  sum: 2,
  name: "Solusindo",
}];

const initialValues = Array.from(new Set(response.map(({date}) => date)), date => [date, 0]);

const dictionary = response.reduce((acc, {
  date,
  sum,
  name
}) => {
  acc[name] = acc[name] || Object.fromEntries(initialValues);

  acc[name][date] = (acc[name][date] || 0) + sum;

  return acc;
}, {});

const result = Object.entries(dictionary).map(([name, sumByDate]) => ({
  date: Object.keys(sumByDate),
  sum: Object.values(sumByDate),
  name
}));


console.log(result);
.as-console-wrapper {
  max-height: 100vh !important;
  top: 0;
}
0 голосов
/ 31 марта 2020

1) Создайте объект с уникальными ключами name и значениями суммы, даты, имени.
2) Go поверх данных с forEach l oop, если ключ не существует, тогда добавьте значения по умолчанию sum с массивом '0' с размером массива дат.
3) Обновите соответствующее значение sum.
4) В функции вернуть значения Object res в виде массива.

const update = data => {
  const dates = [
    "January 2019",
    "February 2019",
    "March 2019",
    "April 2019",
    "Mai 2019"
  ];
  // Alternatively get the dates like
  // const dates = [...new Set(data.map(({date}) => date))];
  const sums = dates.map(x => 0);
  const res = {};
  data.forEach(({ name, sum, date }) => {
    if (!res[name]) {
      res[name] = { date: [...dates], sum: [...sums], name };
    }
    const index = dates.findIndex(month => month === date);
    if (index !== -1) {
      res[name]["sum"][index] = sum;
    }
  });
  return Object.values(res);
};

const data = [
  {
    date: "January 2019",
    sum: 20,
    name: "Persada"
  },
  {
    date: "Februay 2019",
    sum: 21,
    name: "Persada"
  },
  {
    date: "April 2019",
    sum: 22,
    name: "Persada"
  },
  {
    date: "January 2019",
    sum: 10,
    name: "Kharisma"
  },
  {
    date: "March 2019",
    sum: 5,
    name: "Kharisma"
  },
  {
    date: "Februari 2019",
    sum: 4,
    name: "Solusindo"
  },
  {
    date: "Mai 2019",
    sum: 2,
    name: "Solusindo"
  }
];

console.log(update(data));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...