资讯专栏INFORMATION COLUMN

如何随机&&去重返回新数组

Apollo / 2570人阅读

摘要:问题起因姐毫无征兆的在我们的水群里发来一段代码她的目的是想从中随机抽取个不重复的值组成一个新数组问我代码是否有问题很遗憾因为我刚睡醒随便贴了一下代码运行了一下就说没问题很快我就被打脸了也是如果没问题的话她问个毛大家可以先找一下问题下面先

1.问题起因

W姐毫无征兆的在我们的水群里发来一段代码:

var arr = [{q:"1+1=?",a:"2",b:"3",c:"1"},{q:"1+2=?",a:"2",b:"3",c:"7"},{q:"1+0=?",a:"8",b:"3",c:"1"},{q:"1+7=?",a:"8",b:"3",c:"7"},{q:"2+2=?",a:"4",b:"7",c:"1"},{q:"1+3=?",a:"2",b:"4",c:"6"},{q:"1+70=?",a:"72",b:"73",c:"71"},{q:"1+18=?",a:"22",b:"19",c:"21"},{q:"7+11=?",a:"18",b:"23",c:"21"}];
  var resArr = [];
  for(var i = 0; i<5; i++){
    var index = parseInt(Math.random()*10);
    resArr.push(arr[index]);
    for( var j = 0; j

她的目的是想从arr中随机抽取5个不重复的值组成一个新数组resArr.问我代码是否有问题,很遗憾因为我刚睡醒,随便贴了一下代码,运行了一下就说没问题...很快我就被打脸了(也是,如果没问题的话她问个毛..).
大家可以先找一下问题,下面先更正这段代码,然后再给出群里剩下两位大哥的解决方法.

2.代码更正

首先先贴出更正后的代码:

 for(var i = 0; i<5; i++){
        var index = parseInt(Math.random()*arr.length);//限制范围
            resArr.push(arr[index]);
        //每次只需要最后一个压入数组的元素resArr[i]与之前所有元素进行比较
        //若遇到重复的,将resArr[i]弹出并终止循环即可
        for( var j = 0; j

错的原因就是注释里的,我居然一眼没看出来,真是深感惭愧...看来不能眼高手低,得多敲代码了.

3.其它解决方法

我们4人水群里me和另外两位也给出了不同的思路.

3.1水货me给出的思路

作为小水货的我,当时没有立刻看出来错误的地方,所以直接又写了一个水水的方法,请大家不要见笑....

function solve(arr,num){
    var resArr=[],indexArr=[];
    for (var j = 0; j < arr.length; j++) {
        indexArr[j] = 0;
    }
    for(var i=0;i

这里主要使用一个数组indexArr作为一个表记录已经被选择过值,若出现重复则直接跳过.

3.2YC大神给出的解决方法

YC大神作为我们中薪水最高,加班时间最长的,百忙中抽出时间给出了自己的解决方案,在此替W姐感谢过劳肥的YC大神.

function filter(arr, num) {
        var newArr = [];
        //随机删并返回一个值,因为原数组进行了删除操作,就避免了查重
        var pick = function () {
            var index = Math.ceil((arr.length * Math.random())) - 1;
            return arr.splice(index, 1);
        }
        for (var i = 0; i < num; i++) {
           // newArr.push(pick()[0])//这样写就不用数组扁平化了
            newArr.push(pick());
        }
        return newArr
    }
    //数组扁平化
    function flatten(arr) {
        return arr.reduce(function (prev, item) {
            return prev.concat(Array.isArray(item) ? flatten(item) : item);
        }, []);
    }
    var b=flatten(filter(arr, 5))
    console.log(b)

因为一开始看到返回值的时候就想到一个叫做数组扁平化的东西,很悲惨的是只记得名字忘记了实现方案,所以趁此复习一下.这个方案不好的一点就是修改了原数组,这样就无发复用该数组,解决方法是可以在函数中进行一个深拷贝,使用新数组进行操作避免修改原数组.

3.3joker大哥的解决方案

joker大哥作为我们中身材和脸最好的,以骄傲的姿态给出了我们几个公认最优的解决方案.

//核心是随机排序,对传入的o进行o.length次的随机交换,并使用slice进行截取返回
var shuffle = function (o, num) { 
        for (var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x) ;
        return o.slice(0, 5);
    };
    console.log(shuffle(arr))

slice()方法返回原数组的一个浅复制,不修改原数组内容.而且效率也高,只用到了一个for循环,如果说有缺点的话就是可读性略差一些,下面展开一下:

 var newShuffle=function(o,num){
        var j,tmp,i=o.length;
        while(i){
            j=parseInt(Math.random() * i);
            tmp=o[--i];
            o[i]=o[j];
            o[j]=tmp;
            
        }
        return o.slice(0,num)
    }
  console.log(newShuffle(arr,5))
4如果大家发现和我内容差别不大的博客内容

那个就是w姐的博客..欺负我打字慢..

W姐的博客地址

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93796.html

相关文章

  • Python &amp; JavaScript 的数组去重

    摘要:数组去重是实际应用中常用的操作,出现在面试题中的概率也很高,今天简述一下和中数组去重的方法数组去重此时未保持原有的顺序,对进行排序数组去重如过该元素在数组中第一次出现的位置该元素当前的位置将符合条件的元素加入到中 数组去重 是实际应用中常用的操作,出现在面试题中的概率也很高,今天简述一下 Python 和 JavaScript 中数组去重的方法 python数组去重 >>> a = [...

    cppowboy 评论0 收藏0
  • Python &amp; JavaScript 的数组去重

    摘要:数组去重是实际应用中常用的操作,出现在面试题中的概率也很高,今天简述一下和中数组去重的方法数组去重此时未保持原有的顺序,对进行排序数组去重如过该元素在数组中第一次出现的位置该元素当前的位置将符合条件的元素加入到中 数组去重 是实际应用中常用的操作,出现在面试题中的概率也很高,今天简述一下 Python 和 JavaScript 中数组去重的方法 python数组去重 >>> a = [...

    wuyangnju 评论0 收藏0
  • python数学建模Numpy应用介绍与Pandas学习

      小编写这篇文章的主要目的,主要是来给大家解答下关于python数学建模的一些相关的介绍,涉及到内容涵盖Numpy的一些相关的应用具体的一些介绍。另外,还会涉及到相关的Pandas学习知识,具体内容下面给大家详细解答下。  1 Numpy介绍与应用  1-1Numpy是什么  NumPy是一个运行速度非常快的数学库,一个开源的的python科学计算库,主要用于数组、矩阵计算,包含:  一个强大的...

    89542767 评论0 收藏0
  • JS数组中filter方法的使用实例

      1、定义  filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。  2、语法  var newArray = arr.filter(callback(element[, index[, selfArr]])[, thisArg])   3、参数说明  callback  循环数组每个元素时调用的回调函数。回调函数返回 true 表示保留该元素,false 则不保留...

    3403771864 评论0 收藏0
  • python数学建模之Numpy应用介绍与Pandas学习

      小编写这篇文章的一个主要目的,主要是来给大家去做一个介绍。介绍的内容主要是关于建模知识的一些相关介绍,包括其Pandas的一些相关学习,就具体的操作内容,下面就给大家详细解答下。  Numpy学习  1 Numpy介绍与应用  1-1Numpy是什么  NumPy是一个运行速度非常快的数学库,一个开源的的python科学计算库,主要用于数组、矩阵计算,包含:  一个强大的N维数组对象ndarr...

    89542767 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<