Ответ 1
Более читаемым способом будет:
['apple','pear','banana', 'peach'].filter(function(fruit) {
return fruit === 'apple';
}).map(function(fruit) {
return 'I love eating ' + fruit;
})
У меня есть некоторые данные, которые я хотел бы преобразовать с помощью 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']
Любые существующие возможности этого? Разве я не ошибаюсь?
Более читаемым способом будет:
['apple','pear','banana', 'peach'].filter(function(fruit) {
return fruit === 'apple';
}).map(function(fruit) {
return 'I love eating ' + fruit;
})
Если вы не хотите использовать простой цикл 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);
В итоге я объединил два метода вместе в один прототип Array
. Как упоминал @Benmj, вы можете альтернативно поместить это в пользовательскую утилиту lib.
Array.prototype.mapDefinedValues = function(handler) {
return this.map(function(item){
return handler(item);
}).filter(function(item){
return item !== undefined;
});
}
Как было указано в комментариях, вы должны объединить это с фильтром. К счастью, это легко, потому что вы можете использовать методы массива:
['apple','pear','banana', 'peach'].map(function(fruit){
if (fruit === 'apple') {
return undefined;
}
return 'I love to eat ' + fruit;
}).filter(function (item) { return item; });
Один из арендаторов функционального программирования - это то, что вы создаете простые строительные блоки, которые не имеют побочных эффектов. То, что ОП описывает, по существу добавляет побочный эффект к .map
, и этот тип поведения должен быть обескуражен.