Вставьте 3 случайных имени в новый массив - PullRequest
0 голосов
/ 11 октября 2018

Я не могу получить следующий код для возврата 3 случайных имен из этого массива, какие-либо предложения?(Повторяющийся вопрос не решил мою проблему, поэтому моя проблема - 3 значения вместо 1.)

function navn() {
    var arr = ["Hans", "Ole", "Nils", "Olav", "Per", "Knut", "Kari", "Line", "Pia"];
    var nyArr = arr.filter(function (number) {
        return number % 3 === 0;
    });
}

Ответы [ 6 ]

0 голосов
/ 11 октября 2018

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

 random = (arr, n) => {
    let l = [...new Set(arr)].length, res = new Set(), r = () => arr[Math.random() * l | 0]
    if (n > l) throw new Error("length is greater than n unique values");
    while (res.size < n) res.add(r());
    return [...res];
  }

let arr = ["Hans", "Ole", "Nils", "Olav", "Per", "Knut", "Kari", "Line", "Pia"];

  random = (arr, n) => {
    let l = [...new Set(arr)].length, res = new Set(), r = () => arr[Math.random() * l | 0]
    if (n > l) throw new Error("length is greater than n unique values");
    while (res.size < n) res.add(r());
    return [...res];
  }

console.log(random(arr, 9));
console.log(random(arr, 5));
0 голосов
/ 11 октября 2018

Вы можете reduce ввести входной массив в подмножество путем объединения значений входного массива в новый массив:

var a = ["Hans", "Ole", "Nils", "Olav", "Per", "Knut", "Kari", "Line", "Pia"];

const navn = (arr, count) => {
  return arr.reduce((acc, val) => {
    // Get a ~ random number
    let rand = Math.floor(Math.random() * Math.floor(count));
    // Extract the corresponding element, into our accumulator
    acc.length < count && (acc.push(arr.splice(rand, 1)[0]));

    return acc;
  }, []);
}

// Test
console.dir(navn(a, 3));
0 голосов
/ 11 октября 2018

Вы можете включить подчеркивание или lodash в вашем проекте.Тогда вы можете просто использовать это:

_.sample( ["Hans", "Ole", "Nils", "Olav", "Per", "Knut", "Kari", "Line", "Pia"], 3);

или вы также можете использовать метод _.sampleSize в lodash:

_.sampleSize(['January', 'February', 'March'], 3);

Оба дадут вам 3 случайныхэлементы.

0 голосов
/ 11 октября 2018

Вы можете сгенерировать Set из трех случайных индексов и получить элементы по этому индексу (Set гарантирует отсутствие дубликатов).

function navn() {
  var arr = ["Hans", "Ole", "Nils", "Olav", "Per", "Knut", "Kari", "Line", "Pia"];

  var randomIndices = new Set();
  while (randomIndices.size < 3) {
    randomIndices.add(Math.floor(Math.random() * arr.length));
  }

  var nyArr = [...randomIndices].map(function(i) {
    return arr[i];
  });

  return nyArr;
}

console.log(navn());
console.log(navn());
console.log(navn());
0 голосов
/ 11 октября 2018

Существуют разные возможности для решения этой проблемы, еще одна вещь, которая не упоминается в вопросе: должны ли эти 3 имени быть уникальными или могут возникать дубликаты?

сейчас все решения, включая это, могут иметь имядважды или даже трижды в массиве результатов.

Кроме того, я разделил код на несколько функций и создал одну, в которую можно ввести массив значений и количество случайных значений, которые вы хотите получить.обратно:

    var arr = ["Hans", "Ole", "Nils", "Olav", "Per", "Knut", "Kari", "Line", "Pia"];
    
    function getRandomNames(arr, amount){
      var result = [];
      for(var i = 0; i < amount; i++){
        result.push(arr[getRandomIndex(arr.length)]);
      }
      return result;
    }
    
    function getRandomIndex(maxIndex){
      return Math.floor(Math.random() * maxIndex);
    }
    
    console.log(getRandomNames(arr, 3));
0 голосов
/ 11 октября 2018

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

function navn () {
      var arr = ["Hans","Ole","Nils","Olav","Per","Knut","Kari","Line","Pia"];
      let return_arr = [];
     for (let i = 0; i < 3; i++) {
        var random_int = Math.round(Math.random()*(arr.length -1));
        return_arr.push(arr[random_int]);
        arr.splice(random_int, 1);
     }
     return return_arr;
}

console.log(navn());
...