将 3 个随机名称推入一个新数组

Push 3 random names into a new Array

我无法从该数组中获取 return 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;
    });
}

您可以循环设置随机变量。我假设您不想要重复项,因此您还拼接了数组(并根据原始数组的长度确定随机值)

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());

解决这个问题有不同的可能性,问题中没有提到另一件事:这 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));

您可以生成一个包含三个随机索引的 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());

您可以在您的项目中包含 underscore or lodash。然后你可以简单地使用这个:

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

或者你也可以使用lodash中的_.sampleSize方法:

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

两者都会给你 3 个随机元素。

您可以 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));

这是一个 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));