使用一个阵列过滤器而不是多个

Using one array filter instead of multiple ones

有没有办法将所有这些过滤器合并为一个?还是另一种让它更有效的方法?或者只使用 for 循环?

 driving += value.filter((obj) => obj.type === CalendarEventType.MIND && obj.data.practice === 'driving').length;
    breathWork += value.filter((obj) => obj.type === CalendarEventType.MIND && obj.data.practice === 'breath work').length;
    meditation += value.filter((obj) => obj.type === CalendarEventType.MIND && obj.data.practice === 'meditation').length;
    cooking += value.filter((obj) => obj.type === CalendarEventType.MIND && obj.data.practice === 'cooking').length;
    walking += value.filter((obj) => obj.type === CalendarEventType.MIND && obj.data.practice === 'walking').length;
    other += value.filter((obj) => obj.type === CalendarEventType.MIND && obj.data.practice === 'other').length;

他们在我看来很乏味。

您可以采用一组值并使用单个过滤器。

const
    practices = ['driving', 'breath work', 'meditation', 'cooking', 'walking', 'other'];
    filter = ({ type, data: { practice } }) => type === CalendarEventType.MIND && practices.includes(practice),
    result = value.filter(filter),
    count = values.reduce((sum, o) => sum + filter(o), 0);

目前您正在同一个数组上循环 6 次。您可以使用简单的 for 循环或 reduce:

来减少运行时间
const counts = value.reduce((acc, el) => {
  if (el.type !== CalendarEventType.MIND) return acc;
  acc[el.data.practice] = (acc[el.data.practice] ?? 0) + 1
  return acc;
}, {});

示例:

const CalendarEventType = {
  MIND: 1,
  OTHER: 2
};

const value = [
  {type: CalendarEventType.MIND, data: { practice: 'driving' } },
  {type: CalendarEventType.MIND, data: { practice: 'breath work' } },
  {type: CalendarEventType.OTHER, data: { practice: 'breath work' } },
  {type: CalendarEventType.MIND, data: { practice: 'other' } },
  {type: CalendarEventType.MIND, data: { practice: 'other' } },
  {type: CalendarEventType.OTHER, data: { practice: 'other' } },
];

const counts = value.reduce((acc, el) => {
  if (el.type !== CalendarEventType.MIND) return acc;
  acc[el.data.practice] = (acc[el.data.practice] ?? 0) + 1
  return acc;
}, {});

console.log(counts);

一种可能的方法是按 data.practice 分组。由于没有本机“分组依据”功能,您可以自己实现它(如 here), or you could use a library like Lodash or Ramda.

所述

示例,使用 Lodash 的 groupBy:

const filteredItems = value.filter((obj) => obj.type === CalendarEventType.MIND);
const groupedItems = groupBy(filteredItems, obj => obj.data.practice);

然后你可以用groupedItems做任何你想做的事,例如:

driving += groupedItems['driving'] ? groupedItems['driving'].length : 0;

请注意,如果 data.practice 的给定值未在 filteredItems 中表示,则该键将不会出现在 groupedItems 中 - 因此需要检查该键.