2016-02-12 53 views
1

我有形式的元素:擴展角濾波器,用於在數字陣列

{ 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], ... } 

(...其它串屬性)

我的目標是寫的有效角度濾波器使通過過濾$屬性可能,而其他我也可以使用contains過濾器的函數過濾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; 
    } 
+0

您的期望過高了......寫自己的過濾器 – charlietfl

+0

我這樣做,我可以與所選濾鏡陣列該過濾器。但是我無法再過濾'$'屬性。這是否可能與鏈接? – niklas

+0

不知道沒有看到代碼 – charlietfl

回答

1

你應該糾正自己的過濾,因爲你想不同的選擇這裏。

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

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

}) 
+0

感謝指向我在Array.prototype.filter()我會檢查 – niklas

+0

你的第一個函數在過濾器只適用於element.name所以'$'功能無效 – niklas

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>');

+0

謝謝你的純JavaScript解決方案,但我沒有讓它在角度上工作。 – niklas