我有一个数组players[]
通过查找其gameSocketId
值并返回该对象
getUserInfo : function(user)
{
var userInfo = Game.players.filter(function(e) {
return e.gameSocketId === user;
}).pop();
return userInfo;
}
所以我将它存储在像var user = getUserInfo(userId)
之类的变量中我怎样才能找出user
在players[]
数组中知道所有相关信息的位置是什么?
答案 0 :(得分:3)
使用.findIndex
:
getUserInfo : function(user)
{
var userInfoIndex = Game.players.findIndex(function(e) {
return e.gameSocketId === user;
});
return userInfoIndex;
}
请注意,.findIndex
虽然完全指定但默认情况下不包含在大多数JS引擎中 - mdn上有一个polyfill:
if (!Array.prototype.findIndex) {
Array.prototype.findIndex = function(predicate) {
if (this == null) {
throw new TypeError('Array.prototype.findIndex called on null or undefined');
}
if (typeof predicate !== 'function') {
throw new TypeError('predicate must be a function');
}
var list = Object(this);
var length = list.length >>> 0;
var thisArg = arguments[1];
var value;
for (var i = 0; i < length; i++) {
value = list[i];
if (predicate.call(thisArg, value, i, list)) {
return i;
}
}
return -1;
};
}
这个polyfill适用于ES3和ES5浏览器就好了:))
当然,也可以使用正常的for
循环来完成这一过程,这一循环在ES1中一直有效 - 但是你不会得到非常清晰地表达意图的有趣语法:
getUserInfo : function(user) {
for(var i = 0; i < Game.players.length; i++){
if(Game.players[i].gameSocketId === user) return i;
}
return -1;
}
我们不一定要聪明:)
当然,我们也总是效率低下,只需在使用原始方法获取项目后调用.indexOf
。
答案 1 :(得分:1)
Array.filter
的第二个参数是当前项的索引。下面仍然会返回您最初指定的userInfo以及您可以使用索引的任何内容。
getUserInfo : function(user)
{
var playerIndex;
var userInfo = Game.players.filter(function(e, index) {
if (e.gameSocketId === user) {
playerIndex = index;
return true;
}
}).pop();
console.log(Game.players[playerIndex]) // <- the player that is also "user"
return userInfo;
}
答案 2 :(得分:0)
如何使用indexof()
getUserInfo : function(user){
var userInfo = Game.players.filter(function(e) {
return e.gameSocketId === user;
}).pop();
return userInfo;
}
// and later
var user = getUserInfo(userId)
console.log(Game.players.indexOf(user));