搜索数组返回部分匹配

时间:2011-03-26 03:56:35

标签: javascript arrays search mootools

我需要搜索字符串的关联数组值,但只搜索字符串示例的开头:

var stack = ['aba', 'abcd', 'ab', 'da', 'da'];

在值堆栈上搜索值a会返回['abc, 'abcd', 'ab'],而b只会返回b,而搜索“d”会返回[da', 'da']。这样做的方法是什么?

我试图做一个自动完成选择框,但它的自定义所以我需要修改文本事件并搜索我的项目数组以获得用户输入时第一个匹配的索引。

5 个答案:

答案 0 :(得分:3)

upvoted @Mrbuubuu但是你可以做这个作为原型并通过字符串.contains传递过滤器元素更多mootools-ish并且适合中间的匹配,比如'cd'应该返回结果。

例如,一系列品牌,其中一个是the north face,而搜索north的用户应该返回匹配的品牌,但不会因为他们错过了the

此外,在比较值时,您需要确保在搜索字符串和堆栈数组元素上降低了大小写。

这是一个有效输入的示例:http://jsfiddle.net/dimitar/M2Tep/

(function() {
    Array.implement({
        subStr: function(what) {
            return this.filter(function(el) {
                return el.charAt(0) == what;
                // return el.contains(what); // any position match
            });
        }
    });
})();

// return the original array elements
console.log(['aba', 'abcd', 'ab', 'da', 'da'].subStr("d")); 
// ["da", "da"]
或者,您在评论中提到,您真正想要得到的只是原始数组中的索引:

(function() {
    Array.implement({
        getIndexes: function(what) {
            var indexes = [];
            this.each(function(el, index) {
                if (el.charAt(0) == what)
                    indexes.push(index);
            });
            return indexes;
        }
    });
})();


console.log(['aba', 'abcd', 'ab', 'da', 'da'].getIndexes("d")); 
// [3,4]

虽然因为这不会返回数组,但它会破坏链接,因此它不应该是数组的原型而只是一个函数。

答案 1 :(得分:2)

/**
 * Extend the Array object
 * @param candid The string to search for
 * @returns Returns the index of the first match or -1 if not found
*/
Array.prototype.searchFor = function(candid) {
    for (var i=0; i<this.length; i++)
        if (this[i].indexOf(candid) == 0)
            return i;
    return -1;
};

然后你就可以使用它:

var index = stack.searchFor('a');

答案 2 :(得分:2)

如果你想使用mootools来做这件事,你可以使用mootools的过滤方法:

function search(arr, letter) { 
    var matches = arr.filter(function(str) {
        return str.charAt(0) == letter;
    });

    return (matches.length > 0) ? matches : letter;
}

search(stack, 'd'); //returns ['da', 'da']

答案 3 :(得分:1)

实现这一目标的最简单的vanilla javascript是

var stack = ['aba', 'abcd', 'ab', 'da', 'da', undefined, , false, null, 0];
var prefixTextToFind = "a"; //b, c or d

var matches = stack.filter(function(stackValue){
  //get rid of all falsely objects
  if(stackValue) {
    return (stackValue.substring(0, prefixTextToFind.length) === prefixTextToFind);
  }
}); //["aba", "abcd", "ab"]

答案 4 :(得分:0)

Array.prototype.startWith = function(c){
    var result = [];
    for(var i=0, len=this.length; i<len; i++){
        if(this[i].indexOf(c) == 0){
            result.push(this[i]);
        }
    }
    return result || c;
};