Каков наилучший способ l oop через этот объект? - PullRequest
0 голосов
/ 06 марта 2020

Я застрял в цикле через Объект с именем Players, который содержит данные игрока. Я хочу проверить, какой игрок имеет наибольшее значение x и сохранить его в переменной leader, которая изменится, в то время как у другого игрока будет более высокое значение x.

Объект выглядит следующим образом:

var players = {
  '86wjIB7Xbz1tmwlTAAAB': {
     rotation: 0.09999999999999964,    
     x: 579,
     y: 579,
     playerId: '86wjIB7Xbz1tmwlTAAAB'  
   },
  'dWwtnOI8PryXJNDWAAAC': {
    rotation: 0.09999999999999964,    
    x: 488,
    y: 579,
    playerId: 'dWwtnOI8PryXJNDWAAAC'  
  },
 'GZPYpWdrzj9x0-SsAAAD': {
    rotation: -0.09999999999999964,   
    x: 694,
    y: 579,
    playerId: 'GZPYpWdrzj9x0-SsAAAD'  
  }
}

Вот так я хочу, чтобы мой вывод выглядел как

leader = GZPYpWdrzj9x0;

Ответы [ 3 ]

1 голос
/ 06 марта 2020

Это можно сделать с помощью кода ниже:

let data= {
      '86wjIB7Xbz1tmwlTAAAB': {
        rotation: 0.09999999999999964,    
         x: 579,
         y: 579,
         playerId: '86wjIB7Xbz1tmwlTAAAB'  
      },
      'dWwtnOI8PryXJNDWAAAC': {
         rotation: 0.09999999999999964,    
         x: 488,
         y: 579,
         playerId: 'dWwtnOI8PryXJNDWAAAC'  
       },
      'GZPYpWdrzj9x0-SsAAAD': {
         rotation: -0.09999999999999964,   
         x: 694,
         y: 579,
         playerId: 'GZPYpWdrzj9x0-SsAAAD'  
     }
    }

    let max = 0;
    let keyParent;
    let keys = Object.keys(data)

    for (var i = 0; i < keys.length; i++){
        if (data[keys[i]].x > max) {
           max = data[keys[i]].x
           keyParent = keys[i]
        }
    }

    console.log(keyParent)
1 голос
/ 06 марта 2020

Есть несколько способов сделать это. У Джея уже есть хороший ответ, но вот еще один, с несколькими указателями:

Мы начнем с ваших данных:

const playersObj = {
  '86wjIB7Xbz1tmwlTAAAB': {
     rotation: 0.09999999999999964,    
     x: 579,
     y: 579,
     playerId: '86wjIB7Xbz1tmwlTAAAB'  ,
   },
  'dWwtnOI8PryXJNDWAAAC': {
    rotation: 0.09999999999999964,    
    x: 488,
    y: 579,
    playerId: 'dWwtnOI8PryXJNDWAAAC',
  },
 'GZPYpWdrzj9x0-SsAAAD': {
    rotation: -0.09999999999999964,   
    x: 694,
    y: 579,
    playerId: 'GZPYpWdrzj9x0-SsAAAD',  
  },
};

Теперь наша первая цель - превратить этот объект в коллекция объектов - массив, с которым мы можем работать.

Самый простой способ - это получить "ключи" (имена свойств) для объекта:

const playerIds = Object.keys(playersObj); // gives us: ['86wjIB7Xbz1tmwlTAAAB', 'dWwtnOI8PryXJNDWAAAC', 'GZPYpWdrzj9x0-SsAAAD']

Теперь вы можете l oop эти ключи, playerIds и возвращают реальные объекты. Один простой способ:

const players= playerIds.map(playerId => playersObj[playerId]);

Это даст нам те же данные, но в массиве, и мы можем работать с массивом.

Например, давайте отсортируем по x:

players.sort((a, b) => b.x - a.x) // sorts the collection

Мы можем пойти дальше и получить первую запись:

players.sort((a, b) => b.x - a.x)[0];

Наконец, нам нужно только его свойство playerId:

const leader = players.sort((a, b) => b.x - a.x)[0].playerId; // gives this: 'GZPYpWdrzj9x0-SsAAAD'

Все это как исполняемый фрагмент:

const playersObj = {
  '86wjIB7Xbz1tmwlTAAAB': {
    rotation: 0.09999999999999964,
    x: 579,
    y: 579,
    playerId: '86wjIB7Xbz1tmwlTAAAB',
  },
  'dWwtnOI8PryXJNDWAAAC': {
    rotation: 0.09999999999999964,
    x: 488,
    y: 579,
    playerId: 'dWwtnOI8PryXJNDWAAAC',
  },
  'GZPYpWdrzj9x0-SsAAAD': {
    rotation: -0.09999999999999964,
    x: 694,
    y: 579,
    playerId: 'GZPYpWdrzj9x0-SsAAAD',
  },
};
// get the player keys
const playerIds = Object.keys(playersObj);
// turn players into a collection
const players = playerIds.map(playerId => playersObj[playerId]);
const leaderId = players.sort((a, b) => b.x - a.x)[0].playerId;

console.log(`Leader: ${leaderId}`);

В качестве альтернативы, как предлагает Феликс, вы можете пропустить первые несколько шагов. У вас уже есть playerId для каждого объекта, а не только для ключей (как я изначально думал), поэтому вы пропускаете цепочку keys (). Map (), например:

const playersObj = {
  '86wjIB7Xbz1tmwlTAAAB': {
    rotation: 0.09999999999999964,
    x: 579,
    y: 579,
    playerId: '86wjIB7Xbz1tmwlTAAAB',
  },
  'dWwtnOI8PryXJNDWAAAC': {
    rotation: 0.09999999999999964,
    x: 488,
    y: 579,
    playerId: 'dWwtnOI8PryXJNDWAAAC',
  },
  'GZPYpWdrzj9x0-SsAAAD': {
    rotation: -0.09999999999999964,
    x: 694,
    y: 579,
    playerId: 'GZPYpWdrzj9x0-SsAAAD',
  },
};

// turn players into a collection
const players = Object.values(playersObj);

const leaderId = players.sort((a, b) => b.x - a.x)[0].playerId;

console.log(`Leader: ${leaderId}`);
1 голос
/ 06 марта 2020

Пожалуйста, используйте Object.keys

var players = {
    '86wjIB7Xbz1tmwlTAAAB': {
      rotation: 0.09999999999999964,    
      x: 579,
      y: 579,
      playerId: '86wjIB7Xbz1tmwlTAAAB'  
    },
    dWwtnOI8PryXJNDWAAAC: {
      rotation: 0.09999999999999964,    
      x: 488,
      y: 579,
      playerId: 'dWwtnOI8PryXJNDWAAAC'  
    },
    'GZPYpWdrzj9x0-SsAAAD': {
      rotation: -0.09999999999999964,   
      x: 694,
      y: 579,
      playerId: 'GZPYpWdrzj9x0-SsAAAD'  
    }
  }

  const leader = Object.keys(players).reduce((acc, cur) => {
    const obj = players[cur];
    return acc.x < obj.x ? { x:obj.x, leader: obj.playerId } : acc;
  }, { x: 0, leader: "" });

  console.log(leader);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...