Написать вложенный фильтр в одну строку - PullRequest
3 голосов
/ 22 мая 2019

Предположим, это

const someList = Immutable.fromJS([
  {'id': 2, foo: 'puppet'}, 
  {'id': 4, foo: 'kitten'}
]);

//Then I filter like so

const entry = someList.filter(elem => {
    return elem.get('id') === 4
});

console.log(entry);
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.js"></script>

Это дает мне

{'id': 4, foo: 'kitten'}

Как написать функцию фильтра, которая entry равна kitten, без дополнительной строки.

Я пытался

const entry = someList.filter(elem => {
    return elem.get('id') === 4
}).get('foo');

но не повезло.

Ответы [ 3 ]

2 голосов
/ 22 мая 2019

Вы можете найти элемент с Array#find вместо использования Array#filter.

С find вы получаете первый найденный элемент, для которого предикат возвращает true.

const entry = someList.find(elem => elem.get('id') === 4).get('foo');

если вы не уверены в том, что нашли элемент, вам также необходим объект по умолчанию.

const entry = (someList.find(elem => elem.get('id') === 4) || {}).get('foo');
1 голос
/ 22 мая 2019

Используйте деструктуризацию, а find не filter:

const someList = [{'id':2,foo:'puppet'},{'id':4,foo:'kitten'}];
const { foo: entry } = someList.find(({ id }) => id == 4);
console.log(entry);

Неизменная версия JS:

const someList = Immutable.fromJS([
    {'id': 2, foo: 'puppet'}, 
    {'id': 4, foo: 'kitten'}
]);

const entry = someList.find(elem => elem.get('id') === 4).get("foo");

console.log(entry);
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.js"></script>
0 голосов
/ 22 мая 2019

Вы можете отобразить свой массив после фильтра:

    
const someList = Immutable.fromJS([
  {'id': 2, foo: 'puppet'}, 
  {'id': 4, foo: 'kitten'}
]);

const entry = someList.filter(elem => {
  return elem.get('id') === 4
}).map(el => el.get('foo'));

console.log(entry);
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.js"></script>
...