Quicksilver bidirectional algorithm for flexible mapping

I use the flexselect jQuery plugin to make it easier to select on large <select> lists that use the Quicksilver algorithm for flex-match options (fuzzy match?).

For example: 3gscam input quickly matches iPhone 3GS Camera , but cam3gs input cam3gs not work.

Is there a modified version of the Quicksilver algorithm that works in both directions, with a preference for going forward?

An existing jQuery plugin would be useful, so I don't need to download.

+4
source share
1 answer

we see that the direction is set by the for loop from length to 0, if we do not find any option, we can run the same code in another way from 0 to length

Hope I did it right.

  String.prototype.score = function (abbreviation, offset) { offset = offset || 0 // TODO: I think this is unused... remove if (abbreviation.length == 0) return 0.9 if (abbreviation.length > this.length) return 0.0 for (var i = abbreviation.length; i > 0; i--) { var sub_abbreviation = abbreviation.substring(0, i) var index = this.indexOf(sub_abbreviation) if (index < 0) continue; if (index + abbreviation.length > this.length + offset) continue; var next_string = this.substring(index + sub_abbreviation.length) var next_abbreviation = null if (i >= abbreviation.length) next_abbreviation = '' else next_abbreviation = abbreviation.substring(i) var remaining_score = next_string.score(next_abbreviation, offset + index) if (remaining_score > 0) { var score = this.length - next_string.length; if (index != 0) { var j = 0; var c = this.charCodeAt(index - 1) if (c == 32 || c == 9) { for (var j = (index - 2); j >= 0; j--) { c = this.charCodeAt(j) score -= ((c == 32 || c == 9) ? 1 : 0.15) } } else { score -= index } } score += remaining_score * next_string.length score /= this.length; return score } } for (var i = 0; i < abbreviation.length; i++) { //Cangee var sub_abbreviation = abbreviation.substring(i, abbreviation.length-1) //Change var index = this.indexOf(sub_abbreviation) if (index < 0) continue; if (index + abbreviation.length > this.length + offset) continue; var next_string = this.substring(index + sub_abbreviation.length) var next_abbreviation = null if (i >= abbreviation.length) next_abbreviation = '' else next_abbreviation = abbreviation.substring(i) var remaining_score = next_string.score(next_abbreviation, offset + index) if (remaining_score > 0) { var score = this.length - next_string.length; if (index != 0) { var j = 0; var c = this.charCodeAt(index - 1) if (c == 32 || c == 9) { for (var j = (index - 2); j >= 0; j--) { c = this.charCodeAt(j) score -= ((c == 32 || c == 9) ? 1 : 0.15) } } else { score -= index } } score += remaining_score * next_string.length score /= this.length; return score } } return 0.0 } 
0
source

Source: https://habr.com/ru/post/1333952/


All Articles