在 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。 但它有效!