搜索对象数组的JavaScript函数返回undefined而不是object

时间:2015-06-08 22:01:09

标签: 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包含我想要的字符串值。该字符串位于arrayWithData中的某个位置,我想要完整的对象。

var player = findPlayer(arrayWithData,$(this).text());
    console.log(player);

但是" undefined"退回。为什么? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

由于findPlayer正在调用.each()并且return语句位于您传递给.each()的回调中,因此您只能从回调中返回,而不是原始功能。

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

由于您无论如何都要在findPlayer后面抽象搜索操作,我会抛弃.each()并使用常规循环。

function findPlayer(array, playerToFind){
    for (var i=0; i < array.length; i++)
        if(array[i].user_id === playerToFind)
            return array[i];
}

这样也会更快。

请注意,在ECMAScript 6中,您将能够使用.find()方法。

function findPlayer(array, playerToFind){
    return array.find(function(el) {
        return el.user_id === playerToFind;
    });
}

这两种解决方案都具有原生和短路循环的优势。

答案 1 :(得分:1)

findPlayer返回undefined,因为你没有返回任何值。

可以修改功能,使其更接近于此:

function findPlayer(array, playerToFind) {
  var foundPlayer;

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

  return foundPlayer;
}

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