Angularjs 在角JS中用括号过滤数字

Angularjs 在角JS中用括号过滤数字,angularjs,datatables,angularjs-filter,Angularjs,Datatables,Angularjs Filter,我有一个类似这样的json数据 [{姓名:“abc”,计数:“(10)”,{姓名:“xyz”,计数:“(20)”},{姓名:“pqr”,计数:20}] 我使用绑定此数据,现在我想对计数进行排序 按以下方式列出 更新 在下降过程中,应如下所示: 计数 (20) 二十 (10) 在提升中,它应该是 计数 (10) 二十 (20) 我尝试使用在我的表上定义的自定义过滤器实现相同的功能,如下所示 $scope.countFilter = function(item){

我有一个类似这样的json数据

[{姓名:“abc”,计数:“(10)”,{姓名:“xyz”,计数:“(20)”},{姓名:“pqr”,计数:20}]

我使用绑定此数据,现在我想对
计数进行排序

按以下方式列出

更新

在下降过程中,应如下所示:

计数

(20)

二十

(10)

在提升中,它应该是

计数

(10)

二十

(20)

我尝试使用在我的表上定义的自定义过滤器实现相同的功能,如下所示

$scope.countFilter = function(item){                    
         return parseInt(item.count.replace('(', item));        
    };
<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>
但它似乎并没有给我想要的结果

我的桌子如下

$scope.countFilter = function(item){                    
         return parseInt(item.count.replace('(', item));        
    };
<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>

名称
计数
{{item.name}
{{item.count}

您应该创建一个自定义过滤器来对它们进行排序,而不是传递一个谓词函数(该函数只会根据返回值从数组中包含或排除项)

类似这样的东西可以工作。它使用
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>">
更新

现在我更好地理解了这个问题,这是一个使用
datatables
的解决方案

jQuery.fn.dataTableExt.oSort['brackets_nums-asc'] = function (x, y) {
  xVal = x.toString().replace(/\((\d+)\)/, "-$1");
  yVal = y.toString().replace(/\((\d+)\)/, "-$1");
  return xVal - yVal;
}

jQuery.fn.dataTableExt.oSort['brackets_nums-desc'] = function (x, y) {
  xVal = x.toString().replace(/\((\d+)\)/, "-$1");
  yVal = y.toString().replace(/\((\d+)\)/, "-$1");
  return yVal - xVal;
}

$(document).ready(function () {
  $('#example').dataTable({
    "sPaginationType": "full_numbers",
    "bJQueryUI": true,
        "bFilter": true,
        "bRetrieve": true,
        "bStateSave": true,
        "aoColumns": [{}, {
        "sType": "brackets_nums"
    }]
  });
})
我删除了角度过滤器,因为它不是必需的,所以基本上这个解决方案中唯一的角度就是使用
ng repeat

但是它能工作!

嗨,我试着使用你建议的过滤器。但是它给了我(10),(20),20的升序和降序(20),(10)。所以稍微修改一下过滤器函数?:)然后你就快到了…在@Ed Hinchliffe编写的代码中,只需将
return aBrackets[1]-bBrackets[1];
替换为
return bBrackets[1]-aBrackets[1];
@yarons:我做了更改,但仍然没有效果。我尝试在控制台中打印aBrackets和bBrackets的值。它们总是
null
。为什么会这样?为什么使用变量“a”和“b”?它们被赋值了吗?嗨。这是一个很好的解决方案。我尝试了使用它。它给我(10)、(20)升序:(…您是否在实际的数据表中进行了尝试。请检查此示例[.你可以像这里一样绑定数据并检查。你是如何使用升序的?对不起,我没有理解你。当我单击我的数据表列上的排序图标时,顺序就出现了。根据我得到的结果,我告诉你了顺序。你能用你的工作数据表链接到一个工作的JSFIDLE/plunkr吗?是的,请稍候,我会将链接发布到这里也一样