2015-04-10 3 views
2

У меня есть массив players[]Получить позицию объектов в массиве

функцию, которая получает определенный объект из такого массива, отыскав его значение и возвращает этот объект

getUserInfo : function(user) 
     { 
      var userInfo = Game.players.filter(function(e) { 
       return e.gameSocketId === user; 
      }).pop(); 

      return userInfo; 
     } 

gameSocketId поэтому я хранить его в переменной, как var user = getUserInfo(userId) Как я могу, чем узнать, что является позицией user в массиве players[], зная всю информацию об этом?

ответ

3

Использование .findIndex:

getUserInfo : function(user) 
    { 
     var userInfoIndex = Game.players.findIndex(function(e) { 
      return e.gameSocketId === user; 
     }); 

     return userInfoIndex; 
    } 

Обратите внимание, что .findIndex, в то время как полностью указано не входит в состав большинства двигателей JS по умолчанию все же - есть polyfill на mdn:

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

Второй параметр 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; 
    } 
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)); 
Смежные вопросы