@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
JavaScript
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;
}