在 Angular JS 中用括号过滤数字
Filter numbers with parentheses in Angular JS
我有一个 json 这样的数据
[{名称:"abc", 计数:"(10)", {名称:"xyz", 计数:"(20)"}, {名称:"pqr", count:20}]
我使用 Angular datatables 绑定此数据,现在我想对 count
进行排序
栏目如下
更新
在下降时应该是
计数
(20)
20
(10)
升序应该是
计数
(10)
20
(20)
我尝试使用在我的 table 上定义的自定义过滤器实现相同的效果,如下所示
$scope.countFilter = function(item){
return parseInt(item.count.replace('(', item));
};
但是好像没有给我想要的结果。
我的table看起来如下
<table>
<thead>
<tr>
<th>Name</th>
<th>Count </th>
</tr>
</thead>
<tbody>
<tr ng-repeat="item in items |orderBy:'countFilter'">
<td>{{item.name}} </td>
<td>{{item.count}} </td>
</tr>
</tbody>
<table>
您应该制作一个自定义过滤器来对它们进行排序,而不是传递谓词函数(它只会根据 return 值从数组中包含或排除项目。
类似这样的东西会起作用。它使用 array.prototype.sort
和自定义排序功能。
angular.module('myApp', [])
.filter( 'bracketSort', function() {
return function ( inputArray ) {
// Look for brackets
var bracketRegex = /\(([0-9]+)\)/;
return inputArray.sort( function (a, b) {
var aBrackets = bracketRegex.exec(a);
var bBrackets = bracketRegex.exec(b);
// brackets mean a higher value
if(aBrackets && !bBrackets)
return 1;
else if (bBrackets && !aBrackets)
return -1;
else if (aBrackets)
return aBrackets[1] - bBrackets[1];
else
return a - b;
});
};
});
你可以这样使用它:
<tr ng-repeat="item in items | bracketSort">
我有一个有效的解决方案:
就像@Ed Hinchliffe 的解决方案一样-
<tr ng-repeat="item in items | bracketSort:<true or false>">
和过滤器-
.filter('bracketSort', function() {
return function ( inputArray, descending ) {
return inputArray.sort( function (a, b) {
//replace pattern "(number)" with "-number"
aVal = a.count.toString().replace(/\((\d+)\)/, "-");
bVal = b.count.toString().replace(/\((\d+)\)/, "-");
return descending ? bVal- aVal : aVal - bVal;
});
};
})
更新
现在我更好地理解了这个问题,here 是一个适用于 datatables
的解决方案。
jQuery.fn.dataTableExt.oSort['brackets_nums-asc'] = function (x, y) {
xVal = x.toString().replace(/\((\d+)\)/, "-");
yVal = y.toString().replace(/\((\d+)\)/, "-");
return xVal - yVal;
}
jQuery.fn.dataTableExt.oSort['brackets_nums-desc'] = function (x, y) {
xVal = x.toString().replace(/\((\d+)\)/, "-");
yVal = y.toString().replace(/\((\d+)\)/, "-");
return yVal - xVal;
}
$(document).ready(function () {
$('#example').dataTable({
"sPaginationType": "full_numbers",
"bJQueryUI": true,
"bFilter": true,
"bRetrieve": true,
"bStateSave": true,
"aoColumns": [{}, {
"sType": "brackets_nums"
}]
});
})
我删除了 Angular 过滤器,因为它不是必需的,所以基本上这个解决方案中唯一 Angular 的事情就是使用 ng-repeat
。
但它有效!
我有一个 json 这样的数据
[{名称:"abc", 计数:"(10)", {名称:"xyz", 计数:"(20)"}, {名称:"pqr", count:20}]
我使用 Angular datatables 绑定此数据,现在我想对 count
栏目如下
更新
在下降时应该是
计数
(20)
20
(10)
升序应该是
计数
(10)
20
(20)
我尝试使用在我的 table 上定义的自定义过滤器实现相同的效果,如下所示
$scope.countFilter = function(item){
return parseInt(item.count.replace('(', item));
};
但是好像没有给我想要的结果。
我的table看起来如下
<table>
<thead>
<tr>
<th>Name</th>
<th>Count </th>
</tr>
</thead>
<tbody>
<tr ng-repeat="item in items |orderBy:'countFilter'">
<td>{{item.name}} </td>
<td>{{item.count}} </td>
</tr>
</tbody>
<table>
您应该制作一个自定义过滤器来对它们进行排序,而不是传递谓词函数(它只会根据 return 值从数组中包含或排除项目。
类似这样的东西会起作用。它使用 array.prototype.sort
和自定义排序功能。
angular.module('myApp', [])
.filter( 'bracketSort', function() {
return function ( inputArray ) {
// Look for brackets
var bracketRegex = /\(([0-9]+)\)/;
return inputArray.sort( function (a, b) {
var aBrackets = bracketRegex.exec(a);
var bBrackets = bracketRegex.exec(b);
// brackets mean a higher value
if(aBrackets && !bBrackets)
return 1;
else if (bBrackets && !aBrackets)
return -1;
else if (aBrackets)
return aBrackets[1] - bBrackets[1];
else
return a - b;
});
};
});
你可以这样使用它:
<tr ng-repeat="item in items | bracketSort">
我有一个有效的解决方案:
就像@Ed Hinchliffe 的解决方案一样-
<tr ng-repeat="item in items | bracketSort:<true or false>">
和过滤器-
.filter('bracketSort', function() {
return function ( inputArray, descending ) {
return inputArray.sort( function (a, b) {
//replace pattern "(number)" with "-number"
aVal = a.count.toString().replace(/\((\d+)\)/, "-");
bVal = b.count.toString().replace(/\((\d+)\)/, "-");
return descending ? bVal- aVal : aVal - bVal;
});
};
})
更新
现在我更好地理解了这个问题,here 是一个适用于 datatables
的解决方案。
jQuery.fn.dataTableExt.oSort['brackets_nums-asc'] = function (x, y) {
xVal = x.toString().replace(/\((\d+)\)/, "-");
yVal = y.toString().replace(/\((\d+)\)/, "-");
return xVal - yVal;
}
jQuery.fn.dataTableExt.oSort['brackets_nums-desc'] = function (x, y) {
xVal = x.toString().replace(/\((\d+)\)/, "-");
yVal = y.toString().replace(/\((\d+)\)/, "-");
return yVal - xVal;
}
$(document).ready(function () {
$('#example').dataTable({
"sPaginationType": "full_numbers",
"bJQueryUI": true,
"bFilter": true,
"bRetrieve": true,
"bStateSave": true,
"aoColumns": [{}, {
"sType": "brackets_nums"
}]
});
})
我删除了 Angular 过滤器,因为它不是必需的,所以基本上这个解决方案中唯一 Angular 的事情就是使用 ng-repeat
。
但它有效!