angularjs搜索并忽略西班牙语字符
我在页面上添加了一个简单的排序。这个想法是搜索产品。这些产品以西班牙语书写,并带有口音。例如:“Jamón” 这是我的密码: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
<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;
};