【问题标题】: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) 这样的变量中,我怎样才能知道userplayers[] 数组中的位置是什么?

【问题讨论】:

    标签: 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));
        

        【讨论】:

          猜你喜欢
          • 2016-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-27
          • 2018-09-10
          • 1970-01-01
          • 2015-07-01
          • 2018-04-30
          相关资源
          最近更新 更多