【问题标题】:Shuffling multidimensional array in js在js中洗牌多维数组
【发布时间】:2018-09-09 05:34:27
【问题描述】:

这个函数只洗牌矩阵[y],但我希望它洗牌矩阵[y][x],但它不想正确洗牌。

我使用的代码:

function Shuffle(arguments) {
    for (var k = 0; k < arguments.length; k++) {
        var i = arguments[k].length;
        if (i == 0)
            return false;
        else {
            while (--i) {
                var j = Math.floor(Math.random() * (i + 1));
                var tempi = arguments[k][i];
                var tempj = arguments[k][j];
                arguments[k][i] = tempj;
                arguments[k][j] = tempi;
            }
            return arguments;
        }
    }
    return arguments
}

var matrix = [

];

var ab = 36;

for (var y = 0; y < ab; y++) {
    matrix.push([])
    for (var x = 0; x < ab; x++) {
        matrix[y][x] = Math.floor(Math.random() * 1)
    }
    for (var x = 0; x < ab / 2; x++) {
        matrix[y][x] = 1
    }
}


arr = Shuffle(matrix);

console.log(arr)
var side = 16;

function setup() {

    createCanvas(arr[0].length * side, arr.length * side);
    background('#acacac');
    frameRate()

}

function draw() {
    for (var y = 0; y < arr.length; y++) {
        for (var x = 0; x < arr[y].length; x++) {

            if (matrix[y][x] == 0) {
                fill(0, 255, 0)
                rect(y * side, x * side, side, side)
            } else if (matrix[y][x] == 1) {
                fill("red")
                rect(y * side, x * side, side, side)
            } else if (matrix[y][x] == 2) {
                fill(255, 255, 0)
                rect(y * side, x * side, side, side)
            } else if (matrix[y][x] == 3) {
                fill(255, 0, 0)
                rect(y * side, x * side, side, side)
            }
        }
    }
}

所以这个函数只洗牌矩阵[y],但我希望它洗牌矩阵[y][x]。 有任何想法吗?这是截图:

.

【问题讨论】:

  • 先洗行再洗列,或将其合并为一维数组洗牌然后再拆分
  • 我不太擅长数组
  • 我的问题是你在 while 循环之后返回,所以 for 循环并没有像它假设的那样完成
  • 那我该怎么做呢?
  • 只删除返回参数;在while循环之后

标签: javascript arrays canvas multidimensional-array p5.js


【解决方案1】:

正如评论中提到的,您在 whileloop 之后有一个 return 语句,导致 forloop 永远不会按预期完成

function Shuffle(arguments) {
    for (var k = 0; k < arguments.length; k++) {
        var i = arguments[k].length;
        if (i == 0)
            return false;
        else {
            while (--i) {
                var j = Math.floor(Math.random() * (i + 1));
                var tempi = arguments[k][i];
                var tempj = arguments[k][j];
                arguments[k][i] = tempj;
                arguments[k][j] = tempi;
            }
            return arguments; // remove this line
        }
    }
    return arguments
}

【讨论】:

    【解决方案2】:

    您可能可以将其转换为一维数组,然后随机播放,然后再转换回来。你只需要知道你想要多少行。

    const myArr = [[1,2],[3,4]];
    const oneDimArr = myArr.reduce((a, b) => [...a, ...b], []);
    const shuffledArr = Shuffle(oneDimArr); // this is your existing function
    const shuffled2DimArr = shuffledArr.reduce((acc, i) => {
      if(acc[acc.length-1].length >= 2) { // here we build 2 cols
        acc.push([]);
      }
      acc[acc.length-1].push(i);
      return acc;
    }, [[]]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-07
      • 2015-12-11
      • 2020-07-20
      • 1970-01-01
      • 2011-06-11
      • 2019-08-18
      • 1970-01-01
      • 2015-04-15
      相关资源
      最近更新 更多