Поиск в массиве возвращает частичные совпадения - PullRequest
1 голос
/ 26 марта 2011

Мне нужно найти в строке значения ассоциативного массива, но только в начале примера строки:

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

поиск в стеке значения a вернул бы ['abc, 'abcd', 'ab'], а для b просто вернул бы b, в то время как поиск 'd' вернул бы [da', 'da'] ... любым способом сделать это?

Я пытаюсь сделать как поле выбора автозаполнения, но оно настраивается, поэтому мне нужно модифицировать текстовые события и искать в моем массиве элементов, чтобы получить индекс первого совпадения, пока пользователь печатает.

Ответы [ 5 ]

3 голосов
/ 26 марта 2011

upvoted @Mrbuubuu, но вы можете сделать это в качестве прототипа и пропустить фильтрующий элемент через строку .contains, чтобы получить больше mootools-ish и обслуживать совпадения в середине, например 'cd', который должен возвращать результаты.

например, case, массив брендов, один из которых 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 голосов
/ 26 марта 2011

Если вы хотите использовать mootools для этого, вы можете использовать метод filter из 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']
2 голосов
/ 26 марта 2011
/**
 * 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');
1 голос
/ 20 апреля 2016

Самый простой ванильный 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"]
0 голосов
/ 26 марта 2011
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;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...