Уменьшить сложный массив JavaScript к другому массиву на основе каких-либо расчетов? - PullRequest
0 голосов
/ 21 октября 2018

У меня есть массив объектов

data: [
    {
        eventId: "EVEN00001",
        eventType: "call",
        startDate: "2018-08-01T21:30:17+05:30",
    },
    {
        eventId: "EVEN00002",
        eventType: "call",
        startDate: "2018-08-01T21:30:17+05:30",
    },
    {
        eventId: "EVEN00003",
        eventType: "meeting",
        startDate: "2017-02-03T21:30:17+05:30",
    },
    {
        eventId: "EVEN00004",
        eventType: "email",
        startDate: "2018-09-04T21:30:17+05:30",
    },
    {
        eventId: "EVEN00005",
        eventType: "meeting",
        startDate: "2018-09-05T21:30:17+05:30",
    }]

Я хочу уменьшить его до

[{call: 2},{meeting: 2},{email: 1}]

Как я могу добиться этого с помощью метода сокращения JavaScript, каким-то образом я могу достичьжелаемый результат, но это не правильный подход.

data.reduce((acc, item, i, arr) => {
        if (!acc[item.startDate]) {
            acc[item.startDate] = 1;
        } else {
            acc[item.startDate] += 1;
        }
        return acc;
    }, {});
const dayArray = Object.entries(trimedData)
    .reduce((acc, node, i, arr) => {

        let [days, val] = node;
        acc.push({
            days: days,
            value: val
        })
        return acc;
    }, []);

как я могу достичь желаемого результата, используя только поменьше. Или любой другой лучший подход?

Ответы [ 3 ]

0 голосов
/ 21 октября 2018

Не уверен, почему ваше снижение использует startDate, а не eventType

Кроме этого, вы, кажется, на правильном пути

let data = [{
    eventId: "EVEN00001",
    eventType: "call",
    startDate: "2018-08-01T21:30:17+05:30",
  },
  {
    eventId: "EVEN00002",
    eventType: "call",
    startDate: "2018-08-01T21:30:17+05:30",
  },
  {
    eventId: "EVEN00003",
    eventType: "meeting",
    startDate: "2017-02-03T21:30:17+05:30",
  },
  {
    eventId: "EVEN00004",
    eventType: "email",
    startDate: "2018-09-04T21:30:17+05:30",
  },
  {
    eventId: "EVEN00005",
    eventType: "meeting",
    startDate: "2018-09-05T21:30:17+05:30",
  }
];
let result = Object.entries(data.reduce((acc, {eventType}) => (acc[eventType] = (acc[eventType] || 0) + 1, acc), {})).map(([k, v]) => ({[k]:v}));

console.log(result);
0 голосов
/ 21 октября 2018

Вы можете довольно легко свести их к объекту, если вам действительно нужен массив, просто сопоставьте записи объекта

const res = data.reduce((a, b) => {
  a[b.eventType] = (a[b.eventType] || 0) + 1;
  return a;
}, {});

const arr = Object.entries(res).map(([k, v]) => ({
  [k]: v
}));
console.log(arr);
<script>
  const data = [{
      eventId: "EVEN00001",
      eventType: "call",
      startDate: "2018-08-01T21:30:17+05:30",
    },
    {
      eventId: "EVEN00002",
      eventType: "call",
      startDate: "2018-08-01T21:30:17+05:30",
    },
    {
      eventId: "EVEN00003",
      eventType: "meeting",
      startDate: "2017-02-03T21:30:17+05:30",
    },
    {
      eventId: "EVEN00004",
      eventType: "email",
      startDate: "2018-09-04T21:30:17+05:30",
    },
    {
      eventId: "EVEN00005",
      eventType: "meeting",
      startDate: "2018-09-05T21:30:17+05:30",
    }
  ];
</script>
0 голосов
/ 21 октября 2018

reduce в объект, индексированный с помощью eventType, значения которого являются количеством вхождений этого eventType - увеличивайте соответствующее свойство на единицу на каждой итерации.Затем получите значения этого объекта:

const data=[{eventId:"EVEN00001",eventType:"call",startDate:"2018-08-01T21:30:17+05:30",},{eventId:"EVEN00002",eventType:"call",startDate:"2018-08-01T21:30:17+05:30",},{eventId:"EVEN00003",eventType:"meeting",startDate:"2017-02-03T21:30:17+05:30",},{eventId:"EVEN00004",eventType:"email",startDate:"2018-09-04T21:30:17+05:30",},{eventId:"EVEN00005",eventType:"meeting",startDate:"2018-09-05T21:30:17+05:30",}]

console.log(Object.values(
  data.reduce((a, { eventType }) => {
    if (!a[eventType]) a[eventType] = { [eventType] : 0 };
    a[eventType][eventType]++;
    return a;
  }, {})
));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...