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

时间:2018-10-11 15:26:27

标签: javascript arrays arr

我无法获得以下代码从该数组返回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 :(得分:1)

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

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

答案 1 :(得分:0)

有多种解决方案,问题中未提到的另一件事是:这三个名称是唯一的还是重复的?

现在,包括该解决方案在内的所有解决方案在结果数组中的名称都可以为两倍甚至三倍。

另外,我将代码分为几个函数,并在其中创建了一个函数,您可以在其中输入值的数组以及要从中获取多少随机值的数量:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以通过将输入数组的值拼接到新数组中来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));

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

您可以在项目中包含underscorelodash。然后,您可以简单地使用:

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

或者您也可以在lodash中使用_.sampleSize方法:

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

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