首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用不同的值填充数组数组

使用不同的值填充数组数组
EN

Stack Overflow用户
提问于 2016-08-19 07:50:23
回答 3查看 128关注 0票数 2

我有一个包含元素的数组,例如:

代码语言:javascript
运行
复制
var one = [1span,2span,3span,4span,5span,6span,7span];
var two = [1span,2span,3span,4span,5span,6span,7span];
var three = [1span,2span,3span,4span,5span,6span,7span];
var ...till seven.
var total = [one,two,three ..till 7]

因此,我们基本上有7个数组,total variable将为所有7个数组中的每个数组显示7个元素。

现在,我有了一个函数,它应该在每个部分用不同的数字填充我的变量,从1到7。

代码语言:javascript
运行
复制
   var bar = [1, 2, 3, 4, 5, 6, 7];
    for(var j=0; j<total.length; j++) {
      Array.from(total[j]).forEach(function(e, i, a) {
       e.textContent = bar[Math.round(Math.random()*(bar.length-1))];
      console.log(e,i,k);
});
    }

很好,我的函数做到了这一点,但不幸的是,span元素使用来自bar variable的值填充,每个变量来自total var,每次填充7次,每个变量只填充一次。

所以我的问题是:

  1. 我只想用total var的值填充bar array中的每个变量一次。
  2. 每个变量的值应该是随机和唯一的。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-19 08:04:08

您可以使用给定数组的副本并生成不重复的随机项。

代码语言:javascript
运行
复制
function generate(count, values) {
    return Array.apply(null, { length: count }).map(function () {
        var r = [],
            array = values.slice();
        while (array.length) {
            r.push(array.splice(Math.floor(Math.random() * array.length), 1)[0]);
        }
        return r;
    });
}

console.log(generate(7, [1, 2, 3, 4, 5, 6, 7]));

随机化单个数组

代码语言:javascript
运行
复制
function generate(values) {
    var r = [],
        array = values.slice();
    while (array.length) {
        r.push(array.splice(Math.floor(Math.random() * array.length), 1)[0]);
    }
    return r;
}

console.log(generate([1, 2, 3, 4, 5, 6, 7]));

票数 1
EN

Stack Overflow用户

发布于 2016-08-19 09:12:59

如果我们想把这个问题推广到一个N维数组的一般情形中,那么一个可重用的方法如下;

我们将使用两个我非常喜欢使用的泛型函数:Array.prototype.clone()Array.prototype.shuffle()。我们的arrayND函数有不确定的参数数。最后一个参数将指定要填充的随机整数的最小(基)。以前的参数将给出每个维度的长度。因此,在特殊情况下,由于我们需要一个2D 7x7矩阵来填充随机但唯一的数字,从1开始,我们将调用我们作为arrayND(7,7,1)的函数。

代码语言:javascript
运行
复制
Array.prototype.shuffle = function(){
  var i = this.length,
      j;
  while (i > 1) {
    j = ~~(Math.random()*i--);
    [this[i],this[j]] = [this[j],this[i]];
  }
return this;
};

Array.prototype.clone = function(){
  return this.map(e => Array.isArray(e) ? e.clone() : e);
};

function arrayND(...n){
  return n.reduceRight((p,c) => c = Array(...Array(c)).map((e,i) => Array.isArray(p) ? p.clone().shuffle() : i+p));
}

var arr = arrayND(7,7,1);
console.log(arr);

票数 1
EN

Stack Overflow用户

发布于 2016-08-19 13:28:03

由于您希望将这些数组放在一起处理,所以应该将它们放在一个数据结构中:

代码语言:javascript
运行
复制
var spans = [ one, two, tree, ..., seven ]

现在,您想要一个不重复的随机顺序,将可能的索引放入Array并对其进行洗牌:

代码语言:javascript
运行
复制
var indices = [0,1,2,3,4,5,6];

还有一些洗牌的人:

代码语言:javascript
运行
复制
function shuffle(arr){
    for(var i=arr.length, j, tmp; i-- > 1; ){
        tmp = arr[j = 0|(Math.random()*i)];
        arr[j] = arr[i];
        arr[i] = tmp;
    }
    return arr;
}

现在,如果您想要节点总数:

代码语言:javascript
运行
复制
var total = shuffle(indices).map((index, n) => spans[n][index]);

至少就我理解你的问题/代码/意图而言。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39033784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档