2011-03-26 131 views
1

我需要寻找一个关联数组的值的字符串,但只有字符串实例的开头:搜索数组返回部分匹配

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

的价值a在堆栈中的搜索将返回['abc, 'abcd', 'ab']和为b将只返回b而“d”的搜索将返回[da', 'da'] ...没有办法做到这一点?

我试着做这样的自动完成选择框,但其自定义的,所以我需要moditor文本事件和搜索我的项目的阵列,同时在用户键入获得第一场比赛的索引。

+0

其实我需要返回最匹配的指数 – 2011-03-26 03:57:54

+0

MooTools是罚款以及 – 2011-03-26 04:00:40

+1

这是没有关联数组。你不能通过stack ['aba']'来访问“aba”。 “ab”后面还有一个未封装的字符串。 – 2011-03-26 04:06:25

回答

3

upvoted @Mrbuubuu但你可以做到这一点为原型,并通过字符串.contains通过滤芯更mootools的十岁上下和c在中间匹配,比如'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] 

虽然因为这不返回数组,这将打破链,因此它不应该是一个原型阵列,但只是一个函数。

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'); 
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; 
}; 
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'] 
+0

在新的浏览器滤波器是内置阵列的方法。 – wildcard 2011-03-26 10:22:46

1

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"]