【问题标题】:how to return nothing ( empty array) with array.map function如何使用 array.map 函数不返回任何内容(空数组)
【发布时间】:2016-10-29 22:15:48
【问题描述】:

现在,如果检测到列表中的“所有内容”,则输出变为 [""]。
预期输出:[]

Copy.names = rule.names.map(function(x) {                                
    if (x.name ==='Everything') {                                   
        return '';
    } else {
        return x.name;
    }
});

【问题讨论】:

  • 只写return; 另外,考虑使用 Array.prototype.filter 。
  • 如果我这样做,它会返回我不想要的'null'
  • 您可能想使用filter 之类的方法。 map 为您迭代的每个元素返回一个元素。
  • @Angular 将map 更改为filterreturn '' 更改为falsereturn x.name 更改为true
  • 或者你可以简单地把 return x.name === 'Everything' 代替整个 if...else

标签: javascript arrays array-map


【解决方案1】:

我写的一个答案elsewhere 涵盖了这一点,但是如果您希望能够完成Array.map() 的转换,还希望更改输出长度,则需要使用Array.reduce()

不过,通常情况下,过滤会更有意义——最好在映射之前,但如果需要,则在之后。

【讨论】:

    【解决方案2】:

    Array.filter() 的另一种解决方案:

    names.map(
      (x) => x.name === 'Everything' && x.name
    ).filter(Boolean)
    

    【讨论】:

      【解决方案3】:

      使用 Array.prototype.filter:

      Copy.names = rule.names.filter(function(x) {                                
          return x.name !=='Everything';
      }).map(function (x) {
          return x.name;
      });
      

      【讨论】:

      • 我这样做了,它实际上返回 'Everything' ,这是错误的
      • 如果您使用原始帖子中的代码,问题是 Array.prototype.map 对列表中的每个元素都应用了转换。您必须改为使用一些逻辑来删除或忽略您不想要的元素。 Array.prototype.map 没有单独忽略元素的能力,所以必须和其他函数结合使用,比如 Array.prototype.filter:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
      • 不应该是x.name !== 'Everything'吗?
      【解决方案4】:

      如果你可以使用 ES6,你可以使用生成器:

      Copy.names = Array.from(function* () {
          for (var x of rule.names) {
             if (x.name ==='Everything') {                                   
                  // do nothing
             } else {
                  yield x.name;
             }
          }
      })
      

      如果不是...你总是可以选择命令式的方式:

      Copy.names = []
      
      for (var x of rule.names) {
         if (x.name ==='Everything') {                                   
              // do nothing
         } else {
              Copy.names.push(x.name);
         }
      }
      

      【讨论】:

      • 我不认为第一种方法(使用 Array.from 和生成器)有效。我在不同的启用 ES6 的环境中尝试过,它总是返回一个空数组。
      【解决方案5】:

      如果您可以使用 Lodash(我强烈推荐),您可以使用 _.flatMap 以优雅的方式处理它:

      Copy.names = _.flatMap(rule.names, function(x) {
          if (x.name ==='Everything') {                                   
              return [];
          } else {
              return [x.name];
          }
      })
      

      如您所见,它与map 类似,不同之处在于您返回的是项目数组而不是项目。

      【讨论】:

      • 对这种方法的一个警告是,您将为 rule.names 中的每个元素创建一个临时数组。这对于几个元素来说没什么大不了的,但是对于大型列表来说可能会变得很昂贵。
      • 请不要只为一个函数导入重度依赖...
      • @samthet 我认为这个包在构建包中被缩减为只包含使用的函数
      猜你喜欢
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 2017-06-23
      • 2016-08-10
      相关资源
      最近更新 更多