JS: Обрабатывать с помощью свойства find () undefined - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть метод, который возвращает значение из элемента в массиве.Не все элементы имеют свойство, которое я хочу вернуть.Я хотел бы сделать эту функцию с одной строкой, используя метод find().Я попытался решить эту проблему следующим образом:

getExecsFromTour(tourId){
 return this.repInfo.find(el => el.id == tourId ).execs || [];
}

Но элементы, которые не содержат свойство execs, возвращают ошибку undefined.

Чтобы решить эту проблему, я должен был сохранить результат в локальной переменной:

getExecsFromTour(tourId){
    let items       = this.repInfo.find(el => el.id == tourId);
    return items    != undefined ? items.execs : [];
}

Но я хотел бы знать, если я что-то упустил, и эту функцию можно выполнить одним предложением.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Похоже, у вас есть общее представление: Array.prototype.find будет искать в массиве первый элемент, который при использовании в качестве аргумента обратного вызова будет иметь обратный вызов, возвращающий истинное значение.Если ничего не найдено, возвращается undefined.

Ваш код должен работать, но да, один из способов сделать это в одной строке (если хотите) - использовать:

getExecsFromTour(tourId){
  return (this.repInfo.find(el => el.id == tourId) || {}).execs || [];
}

Если Array.prototype.find возвращает undefined, первое внутреннее выражение в скобках будет оцениваться как пустой объект, который может попытаться (и не сможет) получить доступ к ключу .execs без TypeError, что также приведет к undefined, в этом случае функция возвращает пустой массив, что и делает ваш код выше.

РЕДАКТИРОВАТЬ: Кто-то уже прокомментировал это решение, lol, но, как говорится в комментариях, нет ничего плохого в том, чтобы сохранить его многострочным (более читабельным, чтопуть).

0 голосов
/ 18 сентября 2018

как насчет

getExecsFromTour(tourId){
     return this.repInfo.find(el => 'execs' in el && el.id == tourId ).execs || [];
}

...

EDITED

var a = [{execs : 1, id:4}, {id:5}];
function getExecsFromTour(tourId, x){
    return (x = a.find(el => 'execs' in el && el.id == tourId )) ? x.execs : [];
}

на этот раз, по крайней мере, я запускал его пару раз

...