我正在研究一个搜索充满对象的数组的函数(每个对象都有字符串,数字等)。
我的功能
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"退回。为什么? 提前谢谢。
答案 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
方法。