Public
Edited
Apr 19, 2021
Insert cell
Insert cell
Insert cell
data = [
"été",
"tête",
"bête",
"île",
"農学",
"医学",
"Äquatorialguinea",
"Экваториальная_Гвинея"
]
Insert cell
viewof search1 = default_Search(data, {
query: "ile"
})
Insert cell
Insert cell
viewof search2 = fil_Search(data, {
query: "ile"
})
Insert cell
viewof search3 = fil_Search(data, {
query: "学"
})
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
{ // example
let data = "Worldwide Hello Services";
let query = "hello world";
return search(data, { query: query });
}
Insert cell
{
// example: Not work
let data = "Äquatorialguinea";
let query = "Äquator";
return search(data, { query: query });
}
Insert cell
{ // example: Not work
let data = "農学";
let query = "農";
return search(data, { query: query });
}
Insert cell
{ // example
let data = { tag: "red bean", name: "blue bird" };
let query = "red";
return search(data, { query: query, columns: ["tag"] });
}
Insert cell
{ // example
let data = { tag: "red bean", name: "blue bird" };
let query = "blue";
return search(data, { query: query });
}
Insert cell
{
// example
let data = ["red bean", "blue bird"];
let query = "bird";
return search(data, { query: query });
}
Insert cell
Insert cell
// original code
function termFilter(term) {
return new RegExp(`\\b${escapeRegExp(term)}`, "i");
}
Insert cell
// original code
function columnFilter(columns) {
return query => {
const filters = (query + "")
.split(/\s+/g)
.filter(t => t)
.map(termFilter);
return d => {
out: for (const filter of filters) {
for (const column of columns) {
if (filter.test(d[column])) {
continue out;
}
}
return false;
}
return true;
};
};
}
Insert cell
Insert cell
// original code
function searchFilter(query) {
const filters = (query + "")
.split(/\s+/g)
.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)) {
if (filter.test(value)) {
continue out;
}
}
return false;
}
} else {
for (const filter of filters) {
if (!filter.test(d)) {
return false;
}
}
}
return true;
};
}
Insert cell
Insert cell
Insert cell
Insert cell
{
// don't break the existing code
let data = "Worldwide Hello Services";
let query = "hello world";
return proposed_search(data, { query: query });
}
Insert cell
{
// don't break the existing code
let data = { tag: "red bean", name: "blue bird" };
let query = "red";
return proposed_search(data, { query: query, columns: ["tag"] });
}
Insert cell
{
// example: use customized termFilter
let data = "Worldwide Hello Services";
let query = "ell vice";
let matchingFilter = term => {
return new RegExp(`${escapeRegExp(term)}`, "iu");
};

return proposed_search(data, {
query: query,
matchingFilter: matchingFilter
});
}
Insert cell
{
// example: use customized termFilter
let data = "Äquatorialguinea";
let query = "Äquator";
let matchingFilter = term => {
return new RegExp(`${escapeRegExp(term)}`, "iu");
};

return proposed_search(data, {
query: query,
matchingFilter: matchingFilter
});
}
Insert cell
{
// example: use customized termFilter
let data = "農学";
let query = "農";
let matchingFilter = term => {
return new RegExp(`${escapeRegExp(term)}`, "iu");
};

return proposed_search(data, {
query: query,
matchingFilter: matchingFilter
});
}
Insert cell
{
// example: normalize both data and query

let data = "\u0041\u006d\u00e9\u006c\u0069\u0065"; //Amélie
let query = "\u0041\u006d\u0065\u0301\u006c\u0069\u0065"; // Amélie

let matchingFilter = term => {
// similar to the original termFilter
return new RegExp(`\\b${escapeRegExp(term.normalize())}`, "iu");
};
let transformData = data => {
return data.normalize();
};

return proposed_search(data, {
query: query.normalize(),
matchingFilter: matchingFilter,
transformData: transformData
});
}
Insert cell
Insert cell
function proposed_searchFilter(query, { matchingFilter, transformData } = {}) {
const filters = (query + "")
.split(/\s+/g)
.filter(t => t)
.map(matchingFilter);
return d => {
if (d == null) return false;
if (typeof d === "object") {
out: for (const filter of filters) {
for (const value of valuesof(d)) {
if (filter.test(transformData(value))) {
continue out;
}
}
return false;
}
} else {
for (const filter of filters) {
// NEW: transform data
if (!filter.test(transformData(d))) {
return false;
}
}
}
return true;
};
}
Insert cell
function proposed_columnFilter(columns) {
return (query, { matchingFilter, transformData } = {}) => {
const filters = (query + "")
.split(/\s+/g)
.filter(t => t)
.map(matchingFilter);
return d => {
out: for (const filter of filters) {
for (const column of columns) {
if (filter.test(transformData(d[column]))) {
continue out;
}
}
return false;
}
return true;
};
};
}
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