搜索对象数组的JavaScript函数返回未定义的而不是对象

搜索对象数组的JavaScript函数返回未定义的而不是对象,javascript,jquery,arrays,object,Javascript,Jquery,Arrays,Object,我正在研究一个函数,它搜索一个填充了对象的数组,每个对象都有字符串、数字等 我的职能 function findPlayer(array, playerToFind){ $.each(array, function(index, el) { console.log(el); if(el.user_id === playerToFind){ return el; } }); } 单击按钮时我会这样称呼它。我已经检查过$this.text是否包含我想要的字符

我正在研究一个函数,它搜索一个填充了对象的数组,每个对象都有字符串、数字等

我的职能

function findPlayer(array, playerToFind){
$.each(array, function(index, el) {
    console.log(el);
    if(el.user_id === playerToFind){
        return el;
    }
}); }
单击按钮时我会这样称呼它。我已经检查过$this.text是否包含我想要的字符串值。这个字符串在数组中的某个位置,我想要完整的对象

var player = findPlayer(arrayWithData,$(this).text());
    console.log(player);
但是未定义的返回。为什么? 提前感谢。

因为findPlayer正在调用。每个和return语句都在您传递给的回调中。每个都只从回调返回,而不是从原始函数返回

请记住,您将回调传递给jQuery,而jQuery在每次迭代中都会为您调用它,这意味着jQuery在内部从您的return语句接收值

既然你在findPlayer后面抽象搜索操作,我就放弃每个,只使用一个常规循环

function findPlayer(array, playerToFind){
    for (var i=0; i < array.length; i++)
        if(array[i].user_id === playerToFind)
            return array[i];
}
这两种解决方案都具有本机和短路循环的优点。

findPlayer返回未定义的值,因为它不返回任何值

您可以修改该函数以更接近于此:

function findPlayer(array, playerToFind) {
  var foundPlayer;

  $.each(array, function(index, el) {
      if (el.user_id === playerToFind) {
        foundPlayer = el;
        return false;
      }
  }); 

  return foundPlayer;
}

就我个人而言,我可能不会这样做,而是简单地使用for循环进行迭代,或者使用类似lodash/下划线的find方法。

您的findPlayer不会返回。您传递给$.each的回调是。因为每个回调都迭代一个对象,比如数组,它实际上并不用于查找该对象中的内容,尽管您可以修改代码以执行所需操作。findPlayer不会返回任何东西,这就是您所调用的。看起来更像是一个简单的迭代和返回就足够了,或者使用像下划线/lodash的find这样的库就更合适了。我不明白。。。我在做回程el;这应该会返回元素,对吗?@Thanor它会返回元素,但每个元素都不关心您返回的内容。如果不是true,则可以返回false以退出循环。在对每个函数进行逻辑比较时,会混淆回调函数。他们不一样,这是怎么回事?如果它找到了对象,则返回false。尝试此操作时没有错误,但console.log不会打印任何内容,而不会打印我正在搜索的对象for@Thaenor,jQuery.each通过显式返回false来打破循环。@Thanor:鉴于您在问题中没有提供任何实际数据,我们不可能知道出了什么问题。如果我猜的话,我会猜$this.text包含了文档中的一些空白填充,但这只是一个猜测。实际上我想我需要提出另一个问题。。。因为这是另一个问题。。。奇怪的是,到目前为止它还在工作,但现在刚刚坏掉……我想我可能已经找到了答案。。。这是JQuery事件委托。非常感谢大家!我很高兴每个人都齐声伸出援助之手。。。我甚至不知道该选哪一个。。。有这么多很棒的答案…谢谢你的回答。我终于明白怎么了。我在一个函数中的一个函数中。我喜欢你使用array.find的解决方案,我正在尝试,不幸的是,它没有产生任何结果。。。我不明白为什么,我应该输出到控制台,并在一个模态中显示一个完全不同的东西。。。但两者都不起作用。
function findPlayer(array, playerToFind) {
  var foundPlayer;

  $.each(array, function(index, el) {
      if (el.user_id === playerToFind) {
        foundPlayer = el;
        return false;
      }
  }); 

  return foundPlayer;
}