我使用angularJS作为我的webapp,我遇到了以下问题。当我使用angularjs' filter进行搜索时,让我们说" John Smith",我的对象,按照以下方式构建({firstname:' John',lastname :' Smith'}),因为名字和姓氏不属于同一个密钥而无法识别。
知道如何将空间变成空格或搜索其他键(或数组)吗?
答案 0 :(得分:1)
修改强>:
根据您的要求,我想出了这个:
$scope.compFunc = function(actual, expected) {
var expectedSplit = expected.split(' ');
var fullActual;
//Search people for the person the name belongs to
$scope.names.forEach(function(person){
angular.forEach(person, function(name){
if (name === actual) {
fullActual = person;
}
})
})
//create an array from the names object for comparison
var fullActualArray = [];
angular.forEach(fullActual, function(name, key){
if (key != '$$hashKey')
fullActualArray.push(name = name.toLowerCase());
})
fullActualArray.sort();
expectedSplit.sort();
return actual.toLowerCase().indexOf(expected.toLowerCase()) > -1||
fullActualArray.join(',') === expectedSplit.join(',');
};
这应该与您的期望相符。
注意:为了清楚起见,我使用了forEach
,但是如果您有大量数据,则可能需要将其更改为for
个循环,这些循环速度提高了90%,并且在找到匹配。
以前的解决方案:
这很简单,检查搜索中输入的值(expected
)是否存在于名字或姓氏(actual
)中,或相反。所以进入“Robert Downy”应该有效,但“Robert blargh”或“abcDownyefg”也是如此。检查整个事物(名字+姓氏)是你必须在比较功能之外做的事情,并且据我所知,不支持开箱即用的角度。
我还使用以下内容创建了一个新数组,以便使用全名进行比较:
$scope.fullnames = $scope.names.map(function(name){
return {
firstname: name.firstname,
lastname: name.lastname,
fullname :name.firstname + " " + name.lastname
}
})
虽然扩展原始数组可以这样做:
$scope.names.forEach(function(name){
angular.extend(name,{fullname:name.firstname + " " + name.lastname});
})
这很简单有效,也是我会做的。
答案 1 :(得分:0)
您可以创建自己的custom filter,并随意搜索。