dual-data-picker
Version:
## Settings editableDiv : true This use div instead input. Usefull to eliminate autocomplete feature.
84 lines (61 loc) • 1.99 kB
JavaScript
export default class SearchEngine {
constructor() {
this._searchString = '';
this._data = [];
}
set searchString(str) {
this._searchString = (str || '').toString().toLowerCase().trim();
}
get searchString() {
return this._searchString;
}
set data(dataArray) {
this._data = Array.isArray(dataArray) ? dataArray : [];
}
get data() {
return this._data;
}
search() {
if (!this._searchString || this._searchString === '') {
return this._data;
}
let found = [];
for (let i = 0; i < this._data.length; i++) {
const item = this._data[i];
const value = (item.search || item.label || '').toString().toLowerCase();
let score = this.getScore(value, this._searchString);
if (score == 0) {
continue;
}
found.push({
original: item,
score: score
});
}
found.sort((a, b) => b.score - a.score);
return found.map(entry => entry.original);
}
getScore(value, searchString) {
let score = 0;
const searchWords = searchString.split(/\s+/);
const valueWords = value.split(/\s+/);
if (value === searchString) {
score += 10000;
}
if (value.startsWith(searchString)) {
let dif = value.length - searchString.length;
score += (1000 - dif);
}
for (let i = 0; i < searchWords.length; i++) {
const word = searchWords[i];
if (valueWords.includes(word)) {
score += 100;
}
const splits = value.split(word);
if (splits.length > 1) {
score += splits.length * word.length;
}
}
return score;
}
}