为数组中的数字扩展角度过滤器

时间:2016-02-12 13:46:37

标签: javascript angularjs angular-filters

我有以下形式的元素:

{ number: 1, name: 'name1', selected:[100,400,210,103,102], ... },
{ number: 2, name: 'name2', selected:[100,400,210,104,102], ... },
{ number: 3, name: 'name3', selected:[100,103], ... }

(...是其他字符串属性)

我的目标是编写一个有效的角度过滤器,以便通过$属性进行过滤,而其他我也可以使用包含过滤器的功能过滤selected数组。

  

请注意,命名属性将匹配同一级别的属性   只有,而特殊的$属性将匹配相同的属性   等级或更深。例如。一个数组项   {name: {first: 'John', last: 'Doe'}}   将不会与{name: 'John'}匹配,但会匹配   {$: 'John'}

使用过滤器{$: 'name', selected[100,103]}过滤应该例如返回上面的第一个和第三个元素。是否可以简单地编写一个过滤器来过滤所选的(我做过)并用另一个过滤器链接它?或者甚至可以不编码我自己的过滤器? 我的过滤器代码基本上是:

.filter('selectedFilter', function (underscore) {
  return function (elements, filter) {
    var result = [];
    for (var idx in elements) {
      var element = elements[idx];
      if (underscore.intersection(element.selected, filter.selected).length === filter.selected.length) {
        result.push(element[idx]);
      }
    }
    return result;
  }
}

我正在使用过滤器:

<ion-item ng-repeat="element in vm.filtered = ( vm.filterElements(vm.searchFilter)) 
track by $index"></ion-item>

,其中

  function filterElements (filter) {
    var filteredElements = $filter('selectedFilter')(vm.elements, filter);
    return filteredTrees;
  }

2 个答案:

答案 0 :(得分:1)

你应该对自己的过滤器有所帮助,因为你想在这里有不同的选择。

angular.filter('special', function(){

    return function mySpecificFilter(array, filter){
       return array.filter(function(element){
        element.name === filter.$ && /* filter to check selected field     */
      })
 }

})

答案 1 :(得分:1)

您可以将Array#filter()与简单的Javascript:

一起使用

var array = [{ number: 1, name: 'name1', selected: [100, 400, 210, 103, 102] }, { number: 2, name: 'name2', selected: [100, 400, 210, 104, 102] }, { number: 3, name: 'name3', selected: [100, 103] }],
    search = { selected: [100, 103] },
    result = array.filter(function (a) {
        return Object.keys(search).some(function (k) {
            return search[k].every(function (b) {
                return ~a[k].indexOf(b);
            });
        });
    });

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');