Public
Edited
Jul 7, 2023
Insert cell
Insert cell
Insert cell
Insert cell
normalize = str => String(str).normalize()
Insert cell
Insert cell
Insert cell
function columnFilter(columns) {
return query => {
const filters = normalize(query + "") // normalize
.split(/\s+/gu) // unicode
.filter(t => t)
.map(termFilter);
return d => {
out: for (const filter of filters) {
for (const column of columns) {
// normalize
if (filter.test(normalize(d[column]))) {
continue out;
}
}
return false;
}
return true;
};
};
}
Insert cell
function searchFilter(query) {
const filters = normalize(query + "") // normalize
.split(/\s+/gu) // unicode
.filter(t => t)
.map(termFilter);
return d => {
if (d == null) return false;
if (typeof d === "object") {
out: for (const filter of filters) {
for (const value of valuesof(d)) {
// normalize
if (filter.test(normalize(value))) {
continue out;
}
}
return false;
}
} else {
for (const filter of filters) {
// normalize
if (!filter.test(normalize(d))) {
return false;
}
}
}
return true;
};
}
Insert cell
function termFilter(term) {
// normalize, unicode
return new RegExp(`${escapeRegExp(term)}`, "iu");
}
Insert cell
function escapeRegExp(text) {
// unicode
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/gu, "\\$&");
}
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more