JS:Array.map不添加到数组

时间:2014-11-24 17:07:28

标签: javascript arrays map

我有一些数据我想使用Array.prototype.map进行转换。但是在map函数中,外部函数调用可能会抛出错误。我想捕获此错误,而不是将该特定对象添加到返回的数组中。目前我只是返回undefined,然后使用Array.prototype.filter来清除未定义的值,但这似乎是一种肮脏的方式。

为了澄清,我正在寻找这个功能:

['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']

任何现有的实现方法?我只是以错误的方式解决这个问题吗?

6 个答案:

答案 0 :(得分:9)

更可读的方式是;

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

答案 1 :(得分:7)

如果您不想使用简单的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);

所以我的想法是,在“异常”的情况下,你只需返回prev数组而不修改它。

答案 2 :(得分:3)

我最终将这两个方法合并为Array原型中的一个。正如@Benmj所提到的,您也可以将它放在自定义实用程序库中。

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

答案 3 :(得分:1)

Mozilla的Array.prototype.map()的MDN为此使用 forEach for-of

由于map会构建一个新数组,因此当您不使用返回的数组时使用它是一个 反模式使用forEach或for-of。

在以下情况下,您不应使用地图

您没有使用它返回的数组;和/或 您没有从回调中返回值

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map#When_not_to_use_map

答案 4 :(得分:0)

正如评论中所述,您应该将其与过滤器结合使用。幸运的是,这很容易,因为你可以链数组方法:

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

更新

像这样的函数式编程的一个租户就是你创建了没有副作用的简单构建块。 OP所描述的内容实质上是为.map添加副作用,不鼓励这种行为。

答案 5 :(得分:0)

上面的答案可以进一步减少。

此代码段实际上可以进一步减少。如果可以的话,总是避免推入阵列。

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