UNPKG

@selenite/commons

Version:

This typescript package provides a set of frequently used utilities, types and svelte actions for building projects with Typescript and Svelte.

66 lines (65 loc) 1.97 kB
import { isEmpty, isEqual } from 'lodash-es'; import { isIterable } from './iterable'; export function getActiveFilters(filters) { const activeFilters = new Map(); for (const f of filters ?? []) { if (!f) continue; const { active = true, key, value } = f; if (!active) continue; if (!activeFilters.has(key)) activeFilters.set(key, new Set([])); activeFilters.get(key).add(value); } return activeFilters; } export function filterItems({ items = [], filters = [] } = {}) { const res = []; const activeFilters = getActiveFilters(filters); if (activeFilters.size === 0) return Array.from(items); for (const item of items) { for (const [key, set] of activeFilters) { const v = item[key]; if (Array.from(set).some((filterV) => { if (isIterable(v)) { return Array.from(v).some((iterV) => isEqual(iterV, filterV)); } return isEqual(v, filterV); })) { res.push(item); break; } } } return res; } export function getQueriedItems({ items = [], query, queriedKeys = [] }) { if (!query) return Array.from(items); if (isEmpty(queriedKeys)) return []; query = query.toLowerCase(); const res = []; for (const item of items) { for (const key of queriedKeys) { const v = item[key]; if (!v) continue; if (!Array.isArray(v)) { if (typeof v !== 'string' || !v.toLowerCase().includes(query)) { continue; } } else { if (!v.some((s) => s.toLowerCase().includes(query))) { continue; } } res.push(item); break; } } return res; }