2015-10-22 117 views
0

我正在研究一個Ionic混合應用程序,但我在Javascript/AngularJS中頗爲新穎。另一個陣列的AngularJS濾波器陣列

我有這樣的數據結構:

var objects= [ 
    { 
     name: "o1", 
     company: { 
     id:2, 
     fields: [1,6] 
     } 
    }, 
    { 
     name: "o2", 
     company: { 
     id:2, 
     fields: [3,4,5] 
     } 
    } 
    ]; 

    var selectedFields= [ 
    { 
     id: 1, 
     name: "f1", 
    }, 
    { 
     id: 2, 
     name: "f2", 
    } 
    ]; 

我要篩選與包含在selectedFields array的元素對應的元素objects array含有的ID(在屬性company.fields)。

例如,在這種情況下,我們有2個元素,o1o2o1包含fields16,並且o2包含fields3,45selectedFields array包含fieldsids12,所以在這種情況下,過濾的object應該是對象o1

這是我曾嘗試:

var filteredObjects = filterFilter(objects, selectedFields,function(o, sf){ 
     return angular.forEach(o.company.fields, function (field) { 
     return field.id == sf.is; 
     }); 
}); 

但它說,o is undefined

和:

var result = []; 
    angular.forEach(objects, function(o){ 
    angular.forEach(o.company.fields, function(f){ 
     angular.forEach(selectedFields, function(sf){ 
     if(sf.id == f.id) { 
      result.push(o); 
     } 
     }); 
    }); 
    }); 

condition if(sf.id == f.id)是永遠true

任何想法?感謝

回答

2

嘗試這種情況:

var test = objects.filter(function (o) { 
    return selectedFields.some(function (i) { 
     /* 
      Some will return true if any of the elements return true 
     */ 
     return i.id === o.company.id; 
    }); 
}); 

基本上被過濾對象陣列。如果回調函數返回true,則.Filter()將創建一個具有舊元素的新數組。如果任何回調返回true,.some()將會返回true。

所以.some()返回true,如果id的匹配,則傳入.filter()告訴過濾器將該元素添加到新數組。

.some()是有效的,它將停止迭代,如果它找到匹配的結果,回調返回true。 .forEach()將繼續並不會返回一個值。

http://jsfiddle.net/08tvmdyh/

一些文檔:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/some

的非常有效的方法數組列表:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Methods_2


編輯:我誤解你的問題抱歉。

var test = objects.filter(function (o) { 
    return selectedFields.some(function (i) { 
     /* 
      Some will return true if any of the elements return true 
     */ 
     return o.company.fields.indexOf(i.id) !== -1; //i.id === o.company.id; 
    }); 
}); 

伊夫修改小提琴:http://jsfiddle.net/08tvmdyh/1/

+0

謝謝你們!這正是我正在尋找的... – Saxophonist

1

試試這個:

var filteredObjects = objects.filter(function(o){ 

     var fields = o.company.fields, 
      matched = false; 

     selectedFields.forEach(function(field){ 
      if(fields.indexOf(field.id) != -1){ 
      matched = true; 
      } 
     }); 

     return matched; 
    }); 

先了解內置的Javascript以下3個本地陣列功能:

Array.prototype.filter; 
    Array.prototype.forEach; 
    Array.prototype.indexOf;