36

私は最近、配列を頻繁に使用する傾向があるため、それらをより理解しようとして配列をいじっています。配列を検索し、その要素の値を、選択したフィルターの値を含む別の配列と比較したいというケースがありました。

たとえば、3 つのフィルターを選択した場合、後で一致を新しい配列に書き込みます。3 つのフィルターすべてに一致するもののみです。

理解を容易にするために、 http://jsfiddle.net/easwee/x8U4v/36/に例を設定します

コードは次のとおりです。

var workItems =   [
    { "id": 2616, "category": ".category-copy .category-beauty .category-fashion"}, //this is a match
    { "id": 1505, "category": ".category-beauty"}, // NOT
    { "id": 1500, "category": ".category-beauty .category-fashion"}, // NOT
    { "id": 692, "category": ".category-stills .category-retouching"}, // NOT
    { "id": 593, "category": ".category-beauty .category-capture .category-fashion .category-product .category-stills .category-stills-retouching "}, // NOT
    { "id": 636, "category": ".category-beauty .category-copy .category-fashion"}, //this is a match
    { "id": 547, "category": ".category-fashion .category-lifestyle .category-stills .category-stills-retouching "}, // NOT
    { "id": 588, "category": ".category-capture .category-recent-work .category-copy .category-beauty .category-fashion"} //this is a match
];

var filtersArray = [".category-beauty", ".category-fashion", ".category-copy"];

var i;
for (i = 0; i < filtersArray.length; ++i) {
    var searchString = filtersArray[i];
    console.log('Searching for: ' + searchString);
    var filtered = $(workItems).filter(function(){
        return this.category.indexOf(searchString);
    });    
}   
console.log('Filtered results: ' + JSON.stringify(filtered, null, 4));

私も試してみました

filtered = $.grep(workItems, function(element, index){
    return element.category.indexOf(filtersArray[i]); 
}, true);

ただし、最初のフィルターのみに一致し、それが最初にある場合にのみ一致しますworkItems.category

私は多くの異なる解決策を試しましたが、実際にはこれを機能させることはできません。目的の結果を返すには、どの関数を使用すればよいですか?

4

4 に答える 4

25

.filter()オブジェクトのメソッドを使用できArrayます:

var filtered = workItems.filter(function(element) {
   // Create an array using `.split()` method
   var cats = element.category.split(' ');

   // Filter the returned array based on specified filters
   // If the length of the returned filtered array is equal to
   // length of the filters array the element should be returned  
   return cats.filter(function(cat) {
       return filtersArray.indexOf(cat) > -1;
   }).length === filtersArray.length;
});

http://jsfiddle.net/6RBnB/

.filter()IE8 などの一部の古いブラウザでは、オブジェクトのメソッドがサポートされていません。jQueryArrayを使用している場合は、jQuery オブジェクトのメソッドを使用でき.filter()ます。

jQuery のバージョン:

var filtered = $(workItems).filter(function(i, element) {
   var cats = element.category.split(' ');

    return $(cats).filter(function(_, cat) {
       return $.inArray(cat, filtersArray) > -1;
    }).length === filtersArray.length;
});
于 2013-09-10T13:02:25.053 に答える
18

.filter()ブール演算子、つまり && で使用できます。

     var find = my_array.filter(function(result) {
       return result.param1 === "srting1" && result.param2 === 'string2';
     });
     
     return find[0];
于 2018-06-25T11:59:50.463 に答える