使用一个阵列过滤器而不是多个
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
中 - 因此需要检查该键.
有没有办法将所有这些过滤器合并为一个?还是另一种让它更有效的方法?或者只使用 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
中 - 因此需要检查该键.