【问题标题】:Function with forEach returns undefined even with return statement即使使用 return 语句,带有 forEach 的函数也会返回 undefined
【发布时间】:2013-04-29 20:04:37
【问题描述】:

我只是在创建一个函数来检查我的对象数组中某物的值,但由于某种原因它一直返回undefined。这是为什么呢?

演示:http://jsfiddle.net/cNYwz/1/

var data = [{
    "Key": "1111-1111-1111",
        "Email": "test@test.com"
}, {
    "Key": "2222-2222-2222",
        "Email": "test@boo.com"
}];


function getByKey(key) {    
    data.forEach(function (i, val) {
        if (data[val].Key === key) {
            return data[val].Key;
        } else {
            return "Couldn't find";
        }
    });
}

var asd = getByKey('1111-1111-1111');
console.log(asd);

【问题讨论】:

  • 因为你没有返回任何东西。
  • getByKey 中的内部匿名函数没有返回到asd

标签: javascript


【解决方案1】:

您的函数 getByKey 没有返回语句。这两个返回是针对 forEach 使用的匿名函数。

【讨论】:

    【解决方案2】:

    除了其他答案中的想法之外,您最好使用 Array.prototype.some,而不是 forEach。这会让你在找到第一个匹配项时停下来:

    function getByKey(key) {    
        var found = null;
        data.some(function (val) {
            if (val.Key === key) {
                found = val;
                return true; //stop iterating
            }
        });
        return found;
    }
    

    您也可以考虑使用过滤器,它可以返回一个仅包含键匹配的对象的数组:

    function filter_array_by_key(key){
        return data.filter(function(v){
            return v.Key===key;
        };
    }
    

    要获取第一个匹配的对象,您可以使用filter_array_by_key(key)[0],如果没有匹配,则会产生 undefined。

    【讨论】:

      【解决方案3】:

      尝试将肯定结果存储为一个变量,然后在函数的末尾返回该变量(或“找不到”,以防什么都没有写入)forEach循环。

      function getByKey(key) {    
          var result;
      
          data.forEach(function (val, i) {
              if (data[val].Key === key) {
                  result =  data[val].Key;
              }
          });
      
          return result || "Couldn't find";
      }
      

      【讨论】:

      • 您已经颠倒了 forEach 的参数顺序。
      • 这是来自 OP,抱歉。
      【解决方案4】:

      在您的函数中,您从传递给forEach 的函数返回,而不是从getByKey

      你可以这样调整:

      function getByKey(key) {    
          var found = null;
          data.forEach(function (val) {
              if (val.Key === key) {
                  found = val;
              }
          });
          return found;
      }
      

      但这会遍历所有元素,即使该项目是立即找到的。这就是为什么你最好使用一个简单的for 循环:

      function getByKey(key) {    
          for (var i=0; i<data.length; i++) {
               if (data[i].Key === key) {
                  return data[i];
              }
          }
      }
      

      请注意,我还修改了您的代码以返回值,而不是键。我想这就是意图。您可能还对另一个迭代函数感到困惑:传递给您给forEach 的回调的第一个参数是数组的元素。

      【讨论】:

        【解决方案5】:

        您没有向外部范围返回任何内容,请尝试以下替代方法:

        function getByKey(key) {    
          var result = data.filter(function (i, val) {
            return data[val].Key == key;
          });
          return result.length ? result : 'Not found';
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-01-24
          • 2019-02-19
          • 2013-12-22
          • 2022-01-22
          • 1970-01-01
          • 1970-01-01
          • 2019-08-26
          相关资源
          最近更新 更多