NodeJS, как ускорить эту функцию создания массива - PullRequest
2 голосов
/ 02 апреля 2019

Трудно было дать хорошее название, чтобы описать, что это такое, но это лучшее, что я придумал. В любом случае, это просто создает колоду карт, а затем удаляет закрытые карты. Производительность имеет решающее значение, так как для создания этой новой колоды, удаления карт в случайном порядке и удаленных карт необходимо выполнить тысячи итераций.

Очень быстро создать колоду, но функция удаления закрытой карты имеет огромный удар по производительности, так как я не могу найти простой способ удалить элемент в JS.

const suits = ['s', 'h', 'd', 'c'];
const remove = ['10s', '11s', '13h', '9c'];

var deck = mkDeck();
shuffle(deck)
rmvHole();

// Functions

function rmvHole() {
  for (let i = 0; i < remove.length; i++) {
    const key = Object.keys(deck).find(key => deck[key] === remove[i]);
    deck[key] = null;
  }
}

function mkDeck() {
  let arr = [];
  for (let s = 0; s < 4; s++) {
    for (let i = 2; i < 15; i++) {
      arr.push(i + suits[s]);
    }
  }
  return arr;
}

function shuffle(a) {
  for (let i = a.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [a[i], a[j]] = [a[j], a[i]];
  }
  return a;
}

console.log(deck);
.as-console-wrapper { max-height: 100% !important; top: auto; }

Ответы [ 3 ]

1 голос
/ 02 апреля 2019

Если масти не собираются меняться, то самый быстрый способ создать это - не иметь петли, просто жестко закодировать массив:

function mkDeck() {
  return [
      '2s', '3s', '4s', '5s', '6s', '7s', '8s', '9s', '10s', '11s', '12s', '13s', '14s', 
      '2h', '3h', '4h', '5h', '6h', '7h', '8h', '9h', '10h', '11h', '12h', '13h', '14h', 
      '2d', '3d', '4d', '5d', '6d', '7d', '8d', '9d', '10d', '11d', '12d', '13d', '14d', 
      '2c', '3c', '4c', '5c', '6c', '7c', '8c', '9c', '10c', '11c', '12c', '13c', '14c', 
  ];
}

Если карты, которые необходимобыть удаленными всегда будут одинаковыми, тогда вы можете просто исключить их из этого жестко запрограммированного массива.

function mkDeck() {
  return [
      '2s', '3s', '4s', '5s', '6s', '7s', '8s', '9s',               '12s', '13s', '14s', 
      '2h', '3h', '4h', '5h', '6h', '7h', '8h', '9h', '10h', '11h', '12h',        '14h', 
      '2d', '3d', '4d', '5d', '6d', '7d', '8d', '9d', '10d', '11d', '12d', '13d', '14d', 
      '2c', '3c', '4c', '5c', '6c', '7c', '8c',       '10c', '11c', '12c', '13c', '14c', 
  ];
}

Это несколько раз обрывает зацикливание над колодой.Итак, весь код, который у вас остался:

let deck = mkDeck();
shuffle(deck);

Если вместо этого карты для удаления являются динамическими, их проще исключить при создании колоды, а не искать их после, таким образом, вы толькоЗацикливайтесь на колоде один раз - при генерации:

const suits = ['s', 'h', 'd', 'c'];
const remove = ['10s', '11s', '13h', '9c'];

var deck = mkDeck();
console.log(deck);


function mkDeck() {
  let arr = [];
  for (let s = 0; s < 4; s++) {
    for (let i = 2; i < 15; i++) {
      let card = i + suits[s];
      //only add if it should be added
      if (!remove.includes(card)) {
        arr.push(card);
      }
    }
  }
  return arr;
}

Это может быть даже быстрее, если remove был объектом { '10s': true, '11s': true, '13h': true, '9c': true }; или набором new Set(['10s', '11s', '13h', '9c']).В любом случае поискам не нужно было бы перебирать весь массив для каждой сгенерированной вами карты.

1 голос
/ 02 апреля 2019

Поскольку deck должен быть массивом, вам определенно не следует перебирать его Object.keys - скорее, поскольку все значения массива являются примитивами, вы можете идентифицировать индекс с помощью indexOf и splice или установитьэлемент в этом индексе массива равен null, если вы этого хотите:

function rmvHole() {
    for (let i = 0, { length } = remove; i < length; i++) {
        const index = deck.indexOf(remove[i]);
        // deck.splice(index, 1);
        // deck[index] = null;
    }
}

(установка индекса в null фактически не удаляет элемент из массива, поэтому ядумая, что вы, возможно, подразумевали, что вместо этого хотели splice

const suits = ['s', 'h', 'd', 'c'];
const remove = ['10s', '11s', '13h', '9c'];

var deck = mkDeck();
shuffle(deck)
rmvHole();

// Functions

function rmvHole() {
  for (let i = 0; i < remove.length; i++) {
    const index = deck.indexOf(remove[i]);
    deck[index] = null;
  }
}

function mkDeck() {
  let arr = [];
  for (let s = 0; s < 4; s++) {
    for (let i = 2; i < 15; i++) {
      arr.push(i + suits[s]);
    }
  }
  return arr;
}

function shuffle(a) {
  for (let i = a.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [a[i], a[j]] = [a[j], a[i]];
  }
  return a;
}

console.log(deck);
.as-console-wrapper {
  max-height: 100% !important;
  top: auto;
}
0 голосов
/ 02 апреля 2019

deck - это массив, поэтому вам не нужно Object.keys:

function rmvHole() {
    remove.forEach(r => deck.splice(deck.indexOf(r), 1));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...