2016-05-10 3 views
0

Я использую lodash для поиска нескольких объектов в массиве.lodash object to array

Вот мой текущий массив при выводе I JSON.stringify(userList):

[ 
    {"Id":1,"Username":"Usr1","Licenses":["IN","OH"]}, 
    {"Id":2,"Username":"Usr2","Licenses":["IN","FL"]}, 
    {"Id":3,"Username":"Usr3","Licenses":["MI"]} 
] 

Я хочу, чтобы найти все кредитные офицеры, которые имеют в штате Индиана в License.

Я использую библиотеку lodash и добавьте следующую строку кода:

var result = _.find(userList, function (o) { return ~o.Licenses.indexOf(state);}); 

Однако это только возвращение 1 объекта, "Id":2 и НЕ ОБА пользователей с Licneses в Индиане.

Как я могу получить _.find() вернуть меня ВСЕ пользователи с лицензией в «IN»? Возможно, мне нужно использовать другой метод lodash, и все в порядке со мной.

Кроме того, если только 1 пользователь возвращается обратно ко мне, как пользователь с лицензией Флорида, мне это нужно, чтобы вернуть результат в виде массива, так же, как так:

[ 
    {"Id":2,"Username":"Usr2","Licenses":["IN","FL"]} 
] 

Благодарим Вас за ваша помощь!

+0

* Вы не можете использовать * '_.find' делать то, что вы хотите. Прочитайте документацию: https://lodash.com/docs#find, где говорится «_.find». Итерации по элементам коллекции, возвращая элемент * first * –

ответ

1

вы можете использовать _.filter - который возвращает все элементы соответствуют

0

метод lodash в _.filter является путь:

итерации через элементы коллекции, возвращая массив всех элементов предикат возвращает truthy для.

_.find возвращает только первый совпавший элемент

0

Вы можете сделать следующее. Он доставит вам все объекты с обычным состоянием. Вы также можете искать несколько состояний.

myData = [ 
 
      {"Id":1,"Username":"Usr1","Licenses":["IN","OH"]}, 
 
      {"Id":2,"Username":"Usr2","Licenses":["IN","FL"]}, 
 
      {"Id":3,"Username":"Usr3","Licenses":["MI"]} 
 
     ], 
 
getAll = (...sts) => myData.reduce((p,o) => sts.some(s => o.Licenses.includes(s)) ? p.concat(o) : p ,[]); 
 

 
document.write("<pre>" + JSON.stringify(getAll("IN"),null,2) + "</pre>");

0

Вы можете использовать array'sfilter функцию без использования lodash

Так один лайнер будет

var state = 'IN'; 
var test = [ 
    {"Id":1,"Username":"Usr1","Licenses":["IN","OH"]}, 
    {"Id":2,"Username":"Usr2","Licenses":["IN","FL"]}, 
    {"Id":3,"Username":"Usr3","Licenses":["MI"]} 
] 

test.filter(x=>x.Licenses.includes(state)) 
0

Существует еще один способ сделать это с помощью цепи, фильтр и включает

var users = [ 
 
    {"Id":1,"Username":"Usr1","Licenses":["IN","OH"]}, 
 
    {"Id":2,"Username":"Usr2","Licenses":["IN","FL"]}, 
 
    {"Id":3,"Username":"Usr3","Licenses":["MI"]} 
 
]; 
 

 
var ret = _.chain(users).filter(function(o){ 
 
     return _.includes(o.Licenses,'IN'); 
 
    }).value(); 
 

 
console.log(ret);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.min.js"></script>