2016-08-25 15 views
1

lodashを使用して以下のオブジェクト配列をフィルタリングするにはどうすればよいですか?ここに私のクエリクエリ配列を使用したlodashフィルタ配列

var query = { "body": ["Hatchback", "Sedan"] }; 

var objects = [{ 
     "make": "BMW", 
     "model": "i3", 
     "maxRange": 81, 
     "price": "42,400", 
     "body": "Hatchback" 
    }, { 
     "make": "Chevrolet", 
     "model": "Spark EV", 
     "maxRange": 82, 
     "price": "25,120", 
     "body": "Hatchback" 
    }, { 
     "make": "Kia", 
     "model": "Soul EV", 
     "maxRange": 90, 
     "price": "31,950", 
     "body": "Wagon" 
    }, { 
     "make": "Tesla", 
     "model": "Model S", 
     "maxRange": 303.2, 
     "price": "75,000", 
     "body": "Sedan" 
    }, { 
     "make": "Tesla", 
     "model": "Model X", 
     "maxRange": 257, 
     "price": "83,000", 
     "body": "SUV" 
}] 

私は_matchesを使用しようとしたが、配列が一致していないようです。ここで

_.filter(objects, _.matches(query)) 

答えて

1

は、うーん、私はlodashをどうするかについて知らない私の試みですが、我々は確かにかかわらず、コードのわずか2行でvanillaJSで行うことができます。

var query = { "body": ["Hatchback", "Sedan"] }; 
var filteredObjArray = objects.filter(obj => query.body.includes(obj.body))) 

ホープが役に立ちます:)。

+0

。しかし、私はクエリプロパティが文字列と配列の間で交互に使用されるより一般的な解決策を必要とし、複数のプロパティを含む{{"body": "Hatchback"、 "make": "BMW"} ' – Dmitry

+0

あなたの条件をテストしてください。 –

1

複数のプロパティを確認するには、.everyでJS .filterを使用できます。クエリのプロパティがある場合、配列は、単純な比較をしない場合は、比較すること.includeを使用します。これは素晴らしい作品

function multipleFilter(arr, query) { 
 
    var queryKeys = Object.keys(query); // create an array of the keys in the query object 
 

 
    return arr.filter(function(item) { 
 
    return queryKeys.every(function(key) { // use .every on the keys so if one fails, the item is filtered out 
 
     var keyData = item[key]; // get the data of the key from the item 
 
     var keyQuery = query[key]; // get the query from query object 
 
     return Array.isArray(keyQuery) ? keyQuery.includes(keyData) : keyQuery === keyData; // if the query is an array use include, if not use comparison 
 
    }); 
 
    }); 
 
} 
 

 
var objects = [{ 
 
    "make": "BMW", 
 
    "model": "i3", 
 
    "maxRange": 81, 
 
    "price": "42,400", 
 
    "body": "Hatchback" 
 
}, { 
 
    "make": "Chevrolet", 
 
    "model": "Spark EV", 
 
    "maxRange": 82, 
 
    "price": "25,120", 
 
    "body": "Hatchback" 
 
}, { 
 
    "make": "Kia", 
 
    "model": "Soul EV", 
 
    "maxRange": 90, 
 
    "price": "31,950", 
 
    "body": "Wagon" 
 
}, { 
 
    "make": "Tesla", 
 
    "model": "Model S", 
 
    "maxRange": 303.2, 
 
    "price": "75,000", 
 
    "body": "Sedan" 
 
}, { 
 
    "make": "Tesla", 
 
    "model": "Model X", 
 
    "maxRange": 257, 
 
    "price": "83,000", 
 
    "body": "SUV" 
 
}]; 
 

 
var query1 = { 
 
    "body": ["Hatchback", "Sedan"] 
 
}; 
 

 
var query2 = { 
 
    "body": ["Hatchback", "Sedan"], 
 
    make: "BMW" 
 
}; 
 

 

 
console.log('query1', multipleFilter(objects, query1)); 
 

 
console.log('query2', multipleFilter(objects, query2));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

関連する問題