【问题标题】:Two-directional Quicksilver algorithm for flex matching用于弹性匹配的双向 Quicksilver 算法
【发布时间】:2011-06-02 06:53:42
【问题描述】:

我正在使用flexselect jQuery plugin 来简化对大型<select> 列表的选择,它使用Quicksilver algorithm 来灵活匹配(模糊匹配?)选项。

例如:3gscam 的输入快速匹配iPhone 3GS Camera,但cam3gs 的输入却没有。

是否有修改后的 Quicksilver 算法版本可以双向工作,并偏好前向匹配?

现有的 jQuery 插件会很有帮助,所以我不必自己动手。

【问题讨论】:

    标签: jquery algorithm reverse quicksilver


    【解决方案1】:

    我们可以看到方向是由for循环设置的,从长度到0 如果我们没有找到任何选项,我们可以从 0 到长度以另一种方式运行相同的代码

    我希望我做对了

         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
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      相关资源
      最近更新 更多