Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
angularjs搜索并忽略西班牙语字符_Angularjs - Fatal编程技术网

angularjs搜索并忽略西班牙语字符

angularjs搜索并忽略西班牙语字符,angularjs,Angularjs,我在页面上添加了一个简单的排序。这个想法是搜索产品。这些产品以西班牙语书写,并带有口音。例如:“Jamón” 这是我的密码: <div class="form-inline"> <label>Search</label> <input type="text" ng-model="q"/> </div> <div ng-repeat="product in products_filtered = (category.pro

我在页面上添加了一个简单的排序。这个想法是搜索产品。这些产品以西班牙语书写,并带有口音。例如:“Jamón”

这是我的密码:

<div class="form-inline">
  <label>Search</label>
  <input type="text" ng-model="q"/>
</div>

<div ng-repeat="product in products_filtered = (category.products | filter:q | orderBy:'name')">
           ....
</div>

搜寻
....
我唯一的问题是你必须输入“Jamón”才能找到产品“Jamón”。我想要的是更加灵活,如果用户输入“Jamon”,结果必须包括“Jamon”

如何使用角度过滤器进行搜索而忘记重音?有什么想法吗


提前感谢。

JavaScript为此提供了一个简洁的函数,称为
localeCompare
,您可以在其中指定
sensitivity=base
,这是一个将
a
视为等效项的选项。我认为您唯一的选择是创建一个过滤函数,手动将两个字符串标准化(用
o
替换
o
等等),并比较结果。

您需要创建一个过滤函数(或完整的过滤器)。这是可能起作用的最简单的事情:

HTML

<div ng-app ng-controller="Ctrl">
    <input type="text" ng-model="search">
    <ul>
        <li ng-repeat="name in names | filter:ignoreAccents">{{ name }}</li>
    </ul>
</div>
jsFiddle


请注意,这只适用于字符串数组。如果要过滤对象列表(并像Angular那样搜索每个对象的每个属性),则必须增强过滤功能。我认为这个例子应该让您开始学习。

这里是上面的一个稍微增强的版本(当然不包括它搜索的额外外来字符)。我把它直接放进我的控制器,它允许我搜索所有我想搜索的数据。感谢Bernardo对此的投入

希望它能帮助别人

 function removeAccents(value) {
    return value
         .replace(/á/g, 'a') 
         .replace(/â/g, 'a')            
         .replace(/é/g, 'e')
         .replace(/è/g, 'e') 
         .replace(/ê/g, 'e')
         .replace(/í/g, 'i')
         .replace(/ï/g, 'i')
         .replace(/ì/g, 'i')
         .replace(/ó/g, 'o')
         .replace(/ô/g, 'o')
         .replace(/ú/g, 'u')
         .replace(/ü/g, 'u')
         .replace(/ç/g, 'c')
         .replace(/ß/g, 's');
}

$scope.ignoreAccents = function (item) {
if ($scope.search) {
var search = removeAccents($scope.search).toLowerCase();
var find = removeAccents(item.name + ' ' + item.description+ ' ' + item.producer+ ' ' +        item.region).toLowerCase();
return find.indexOf(search) > -1;
}
return true;
};

由@Michael Benford提出的方法有一个很大的缺点:它是一个有状态过滤器。这种做法是错误的。另外,该方法不适用于深度数组和对象

我更喜欢扩展标准角度过滤器:

HTML:

<div ng-app ng-controller="Ctrl">
    <input type="text" ng-model="search">
    <ul>
        <li ng-repeat="person in people | filter: search : searchFn">{{ person.names }} {{ person.surnames }}</li>
    </ul>
</div>
function Ctrl($scope) {
        $scope.people = [{names: 'Jose', surnames: 'Benítez'}, {names: 'José María', surnames: 'Núñez Rico'}, {names: 'Rodrigo', surnames: 'Núñez'}];

        $scope.searchFn = function(actual, expected) {
            if (angular.isObject(actual)) return false;
            function removeAccents(value) {
                return value.toString().replace(/á/g, 'a').replace(/é/g, 'e').replace(/í/g, 'i').replace(/ó/g, 'o').replace(/ú/g, 'u').replace(/ñ/g, 'n');
            }
            actual = removeAccents(angular.lowercase('' + actual));
            expected = removeAccents(angular.lowercase('' + expected));

            return actual.indexOf(expected) !== -1;
        }
}
检查解决方案以筛选对象列表,并在每个对象的每个属性中搜索关键字。它还保持类似角度的搜索,并使用/不使用重音字符进行搜索

以下是过滤器定义:-

                // ignore accents filter
            $scope.ignoreAccents = function (item) {
                if (!$scope.search) return true;
                var objects = [];
                var jsonstr = JSON.stringify(item);
                var parsejson = JSON.parse(jsonstr);
                var searchterm = $scope.search.replace(/[!#$%&'()*+,-./:;?@[\\\]_`{|}~]/g, '');    // skip replace if not required (it removes special characters)
                objects = getNoOfResults(parsejson, searchterm);
                return objects.length > 0;
            };

“锋利的s”不应该被“ss”取代吗?甚至是奥地利部分地区的“sz”。
                // ignore accents filter
            $scope.ignoreAccents = function (item) {
                if (!$scope.search) return true;
                var objects = [];
                var jsonstr = JSON.stringify(item);
                var parsejson = JSON.parse(jsonstr);
                var searchterm = $scope.search.replace(/[!#$%&'()*+,-./:;?@[\\\]_`{|}~]/g, '');    // skip replace if not required (it removes special characters)
                objects = getNoOfResults(parsejson, searchterm);
                return objects.length > 0;
            };