【问题标题】:Why does JavaScript map function return undefined?为什么 JavaScript 地图函数返回未定义?
【发布时间】:2013-04-08 20:35:58
【问题描述】:

我的代码

 var arr = ['a','b',1];
 var results = arr.map(function(item){
                if(typeof item ==='string'){return item;}  
               });

这给出了以下结果

["a","b",undefined]

我不想在结果数组中出现undefined。我该怎么做?

【问题讨论】:

  • 因为除非是字符串,否则您不会返回任何内容。因此,最后一项返回undefined。如果它不是字符串,你期望返回什么?一个空字符串?
  • @BenM 如果它不是字符串,我不希望返回任何内容。甚至未定义。
  • 看来我使用了错误的方法来执行此操作。我将按照建议使用过滤器。
  • 您可能想接受答案。
  • jQuery.map 实际上足够聪明,不会在结果数组中包含未定义和空值。

标签: javascript


【解决方案1】:
var arr = ['a','b',1];
var results = arr.filter(function(item){
                if (typeof item ==='string') {return item;}  
               });

【讨论】:

    【解决方案2】:

    如果项目不是字符串,则不会返回任何内容。在这种情况下,函数会返回 undefined,即您在结果中看到的内容。

    map 函数用于将一个值映射到另一个值,但看起来您实际上想要过滤数组,而 map 函数不适合。

    你真正想要的是一个filter 函数。它采用一个函数,该函数根据您是否想要结果数组中的项目返回 true 或 false。

    var arr = ['a','b',1];
    var results = arr.filter(function(item){
        return typeof item ==='string';  
    });
    

    【讨论】:

    • 这很有道理。我不是 .map'ing 我是 .filter'ing...你怎么知道的?! O.o 谢谢^.^
    【解决方案3】:

    如果你这样使用它,你的问题就会迎刃而解。 此外,您将拥有一个干净而简短的代码

    var _ = require('lodash'); //but first, npm i lodash --save
    var arr = ['a','b',1];
    var results = _.compact(
        _.map(arr, function(item){
            if(_.isString(item)){return item;}
        }
    ); //false, null, undefined ... etc will not be included
    

    使用 ES6...

    const _ = require('lodash'); //but first, npm i lodash --save
    const arr = ['a','b',1];
    const results = _.compact(
        _.map(arr, item => {
            if(_.isString(item)){return item;}
        }
    );
    

    【讨论】:

      【解决方案4】:

      如果你必须使用 map 来返回自定义输出,你仍然可以将它与 filter 结合使用。

      const arr = ['a','b',1]
      
      const result = arr.map(element => {
      
        if(typeof element === 'string')
          return element + ' something'
      
      }).filter(Boolean) // this will filter out null and undefined
      
      console.log(result) // output: ['a something', 'b something']
      

      【讨论】:

      • 太棒了!我不知道你可以像这样使用filter。那么,Array.map 将始终返回一个与原始数组具有相同项数的数组,而Array.filter 不会?
      【解决方案5】:

      我的解决方案是在地图之后使用过滤器。

      这应该支持所有 JS 数据类型。

      示例:

      const notUndefined = anyValue => typeof anyValue !== 'undefined'    
      const noUndefinedList = someList
                .map(// mapping condition)
                .filter(notUndefined); // by doing this, 
                            //you can ensure what's returned is not undefined
      

      【讨论】:

        【解决方案6】:

        您可以像下面的逻辑那样实现。 假设你想要一个值数组。

        let test = [ {name:'test',lastname:'kumar',age:30},
                     {name:'test',lastname:'kumar',age:30},
                     {name:'test3',lastname:'kumar',age:47},
                     {name:'test',lastname:'kumar',age:28},
                     {name:'test4',lastname:'kumar',age:30},
                     {name:'test',lastname:'kumar',age:29}]
        
        let result1 = test.map(element => 
                      { 
                         if (element.age === 30) 
                         {
                            return element.lastname;
                         }
                      }).filter(notUndefined => notUndefined !== undefined);
        
        output : ['kumar','kumar','kumar']
        

        【讨论】:

          【解决方案7】:

          过滤器适用于未修改项目的特定情况。 但在很多情况下,当您使用地图时,您希望对传递的项目进行一些修改。

          如果这是您的意图,您可以使用reduce

          var arr = ['a','b',1];
          var results = arr.reduce((results, item) => {
              if (typeof item === 'string') results.push(modify(item)) // modify is a fictitious function that would apply some change to the items in the array
              return results
          }, [])
          

          【讨论】:

          • 谢谢 - map 生成带有 undefined 的数组。 filter 是否只返回项目。这是完美的
          【解决方案8】:

          由于 ES6 filter 支持尖箭头表示法(如 LINQ):

          所以可以归结为以下一条线。

          ['a','b',1].filter(item => typeof item ==='string');
          

          【讨论】:

            【解决方案9】:

            只有在当前元素是string 时才返回值。也许分配一个空字符串就足够了:

            var arr = ['a','b',1];
            var results = arr.map(function(item){
                return (typeof item ==='string') ? item : '';  
            });
            

            当然,如果你想过滤任何非字符串元素,你不应该使用map()。相反,您应该考虑使用 filter() 函数。

            【讨论】:

            • 如果存在数字则返回一个空字符串
            猜你喜欢
            • 2021-11-15
            • 2021-07-18
            • 1970-01-01
            • 2020-03-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多