【问题标题】:Get objects position in array获取对象在数组中的位置
【发布时间】:2015-04-11 05:05:15
【问题描述】:
我有一个数组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[] 数组中的位置是什么?
【问题讨论】:
标签:
javascript
jquery
arrays
【解决方案1】:
使用.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。
【解决方案2】:
Array.filter 的第二个参数是当前项目的索引。下面仍然会返回您最初指定的用户信息,并且您可以将索引用于您想要的任何内容。
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;
}
【解决方案3】:
用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));