celsomtrindade
celsomtrindade

Reputation: 4671

AngularJs search filter ignore punctuation

I have a table with some data. It has name, code, phone, etc.. And this table can have dynamic fields, based on the client option.

I could found a code to make this search ignore the punction, but it has some limitations. On the .filter i need to specify which field I'm going to search, so, because my table is dynamic i don't know what field is being displayed.

This is the link i got the answer from.

And this is the code I'm using:

app.js

.filter('filterMaster', function() {
    return function(items, searchTerm) {
        if (!searchTerm || '' === searchTerm) {
            return items;
        }
        searchTerm = searchTerm.replace(/[^\w\s]|_/g, "").toLowerCase();
        return items.filter(function(element, index, array) {
            var title = element.cod_order.replace(/[^\w\s]|_/g, "").toLowerCase();
            return title.indexOf(searchTerm) > -1;
        });
    }
})

I also tried using this code, which i got from this answer:

app.js

$scope.ignoreAccents = function(item) {
    if (!$scope.searchField)
        return true;
    var text = removeAccents(item.cod_order.toLowerCase())
    var search = removeAccents($scope.searchField.toLowerCase());
    return text.indexOf(search) > -1;
};
function removeAccents(value) {
    return value
    .replace(/á/g, 'a')
    .replace(/é/g, 'e')
    .replace(/í/g, 'i')
    .replace(/ó/g, 'o')
    .replace(/[^\w\s]|_/g, "")
    .replace(/ú/g, 'u');
};

But again, if i don't specify the cod_order, or other field I want to search, it doesn't work. And if i set the field i want to search, than i can't search in anyother field on the table.

The main problem with this, is because i can't search any other field if it's not being set inside this filter.

Is there a way to optimize it so it work doesn't matter what field the table has? And without the need to specify the field name?

Upvotes: 0

Views: 281

Answers (1)

Mauro Cudicio
Mauro Cudicio

Reputation: 85

Try something like this

.filter('filterMaster', function () {
return function (items, searchTerm) {
    if (searchTerm === '') return items;
    var filtered = [];
    var str = searchTerm.replace(/\./g, '');
    for (var i = 0; i < items.length; i++) {
        var itemTmp = items[i];
        var found = false;
        $.each(itemTmp, function (i, n) {
            if(i =='$$hashKey' || found )
                return;
            var replaced = n.toString().replace(/\./g, '');
            if (replaced.indexOf(str) >= 0) 
            {
                filtered.push(itemTmp);
                found = true;
            }
        });
    }
    return filtered;
};

});

here working code.

Upvotes: 1

Related Questions