2016-10-07 2 views
3

Я пытаюсь найти в lodashjavascript library, как найти массив фильтров объектов несколько значений ключа. нечто похожее на SQL - WHERE KEY в (VAL1, val2)Фильтр lodash на ключ с несколькими значениями

Сказав, с следующим примером:

var users = [ 
    { 'user': 'barney', 'age': 36, 'active': true }, 
  { 'user': 'fred',   'age': 40, 'active': false }, 
    { 'user': 'Avding',   'age': 34, 'active': true } 
]; 

_.filter(...) 

Как я могу найти пользователь, кто возраст в (34, 36) ?? номера можно также изменить время выполнения

ответ

3

Lodash-х filter принимает предикат. Вы можете создать предикат, используя частичное приложение, так что вы можете изменить значение легко:

var users = [ 
 
    { 'user': 'barney', 'age': 36, 'active': true }, 
 
    { 'user': 'fred', 'age': 40, 'active': false }, 
 
    { 'user': 'Avding', 'age': 34, 'active': true } 
 
]; 
 

 
var predicate = function(start, end) { 
 
    return function(user) { 
 
    return _.inRange(user.age, start, end + 1); 
 
    } 
 
} 
 

 
var result = _.filter(users, predicate(34, 36)); 
 

 
console.log('inRange', result); 
 

 
/** is equal predicate **/ 
 

 
var predicate = function() { 
 
    var args = _.toArray(arguments); 
 
    
 
    return function(user) { 
 
    var equalToUserAge = _.partial(_.isEqual, user.age); 
 
    
 
    return args.some(equalToUserAge); 
 
    } 
 
} 
 

 
var result = _.filter(users, predicate(34, 40)); 
 

 
console.log('equals', result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>

Вы также можете сделать это легко с ванильным JS, а также (в данном примере используется ES6):

var users = [ 
 
    { 'user': 'barney', 'age': 36, 'active': true }, 
 
    { 'user': 'fred', 'age': 40, 'active': false }, 
 
    { 'user': 'Avding', 'age': 34, 'active': true } 
 
]; 
 

 
const predicate1 = (start, end) => ({ age }) => 
 
    age >= start && age <= end; 
 

 
const result1 = users.filter(predicate1(34, 36)); 
 

 
console.log('in range', result1); 
 

 
const predicate2 = (...args) => ({ age }) => 
 
    args.some((num) => age === num); 
 

 
const result2 = users.filter(predicate2(34, 40)); 
 

 
console.log('is equal', result2);

+0

На самом деле, ваше предложение работает как ** между **, однако мне нужны точные совпадения, поэтому он должен вернуть возраст == 34 или возраст == 36. что, если мне что-то нужно (34, 40). ваш код возвращает 3 объекта, однако мне нужно увидеть только 2 объекта для возраста 34 и 40. – Kenz

+0

Измените предикат на все, что вам нравится. См. Пример предиката в коде. –

0
const users = [ 
    { 'user': 'barney', 'age': 36, 'active': true }, 
    { 'user': 'fred', 'age': 40, 'active': false }, 
    { 'user': 'Avding', 'age': 34, 'active': true } 
]; 

const minAge = 34; 
const maxAge = 36; 

const filtered = _.filter(users, (user) => { 
    return user.age >= minAge && user.age <= maxAge; 
}); 
-1

Вы можете сделать что-то вроде этого:

_.filter(object, { 'age': '34', 'age': '24' }); 

Вопрос в том, если вы делаете это динамически вы не можете иметь один и тот же ключ объекта более одного раза.

Смежные вопросы