Как я могу получить массив случайных ключей от объекта, в отличие от полного списка?

1

Вместо получения, например, первых 5 ключей от объекта с 10 ключами:

var keys = Object.keys(brain.layers[this.layer]).slice(0, 5);

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

function getRandomNumber(n1, n2) { ... }
var list = [];
var count = 0;

function choose(arr, count, list, max) {
  for (let prop in arr) {
    var choice = Math.round(getRandomNumber(0, 1));
    if (choice === 1 && count < max && !list.includes(arr[prop])) {
      list.push(arr[prop]);
      count++;
    }
  }
  if (count >= max) {
    return list;
  } else {
    choose(arr, count, list, max)
  }
}

Но мне было интересно, есть ли более простое и элегантное решение.

  • 2
    var keys = Object.keys(brain.layers[this.layer]).sort(() => Math.random() - 0.5).slice(0, 5);
  • 0
    @JaromandaX <3!
Показать ещё 1 комментарий
Теги:

1 ответ

0

Чтобы получить поистине истинную (псевдо) случайную сортировку, используйте что-то вроде случайной сортировки на месте.

let arrRand=(a,i=a.length)=>{while(i){a.push(a.splice(Math.random()*i--|0,1)[0])}}
let keys = Object.keys(brain.layers[this.layer])
randSort(keys)
keys=keys.slice(0,5)

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню