JS: Array.map не добавлять в массив

У меня есть некоторые данные, которые я хотел бы преобразовать с помощью Array.prototype.map. Однако в функции карты есть вероятность, что ошибка будет вызвана вызовом внешней функции. Я хотел бы поймать эту ошибку и не добавлять этот конкретный объект к возвращенному массиву. В настоящее время я просто возвращаю undefined, а затем используя Array.prototype.filter, чтобы очистить значения undefined, но это похоже на грязный способ сделать это.

Чтобы уточнить, я ищу эту функциональность:

['apple','pear','banana', 'peach'].map(function(fruit){
     if (fruit === 'apple') {
         return undefined;
     }
     return 'I love to eat ' + fruit;
});
// ['I love to eat pear', 'I love to eat peach', 'I love to eat banana']

Любые существующие возможности этого? Разве я не ошибаюсь?

Ответ 1

Более читаемым способом будет:

['apple','pear','banana', 'peach'].filter(function(fruit) {
    return fruit === 'apple';
}).map(function(fruit) {
    return 'I love eating ' + fruit; 
})

Ответ 2

Если вы не хотите использовать простой цикл for, вместо map попробуйте использовать reduce следующим образом:

var result = ['apple','pear','banana', 'peach'].reduce(function(prev, curr){
     if (curr === 'apple') {
         return prev;
     }
     prev.push(curr);
     return prev;
}, []);

alert(result);

Ответ 3

В итоге я объединил два метода вместе в один прототип Array. Как упоминал @Benmj, вы можете альтернативно поместить это в пользовательскую утилиту lib.

Array.prototype.mapDefinedValues = function(handler) {
  return this.map(function(item){
    return handler(item);
   }).filter(function(item){
    return item !== undefined;
   });
}

Ответ 4

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

['apple','pear','banana', 'peach'].map(function(fruit){
     if (fruit === 'apple') {
         return undefined;
     }
     return 'I love to eat ' + fruit;
}).filter(function (item) { return item; });

Обновление

Один из арендаторов функционального программирования - это то, что вы создаете простые строительные блоки, которые не имеют побочных эффектов. То, что ОП описывает, по существу добавляет побочный эффект к .map, и этот тип поведения должен быть обескуражен.