UNPKG

dual-data-picker

Version:

## Settings editableDiv : true This use div instead input. Usefull to eliminate autocomplete feature.

84 lines (61 loc) 1.99 kB
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; } }