【问题标题】:Get the best square like arrangement得到最好的方形排列
【发布时间】:2018-09-26 22:07:10
【问题描述】:

情况

我有一定数量的正方形。我希望这些正方形始终来自像网格一样的正方形,但它不能有任何空白。我会使用 JavaScript 来做到这一点。网格将像这样存储

var gridLayout = [[1, 2], [3, 4]];

这将导致这个网格

问题

如果我有 16 个方块,结果会是

var gridLayout = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]];

还有视觉

现在这一切都很容易做到,但是如果有 3 个方格呢?我希望它做这样的事情,有利于水平布局而不是垂直布局

var gridLayout = [[1, 2, 3]];

与视觉

如果我有 8 个方格,它就无法成为完美的方格,所以我想成为

var gridLayout = [[1, 2, 3, 4], [5, 6, 7, 8]];

还有视觉

我尝试过的

我查看了this,但它似乎使用的是矩形而不是正方形。如果没有他们想要的视觉效果,我也很难跟上。

我还查看了this,这有点相似,但似乎与我的情况有点无关。

结论

如何以我想要的方式创建gridLayout?任何帮助表示赞赏。

【问题讨论】:

  • 看起来您总是想要与子数组中的元素一样多的列和与数组中的元素一样多的行。这应该很容易使用 CSS 网格:css-tricks.com/snippets/css/complete-guide-grid。还是生成数组的问题?
  • 真正的问题是什么?
  • 我不知道图形部分,但这似乎很简单。您有一个 rows 数组(第一级),每一行由 cells (第二级)组成。我不确定您对此有何逻辑问题。
  • 起点stackoverflow.com/questions/8495687/split-array-into-chunks。选择一个将元素数量均匀划分的块大小。然后更改块大小以获得正确的行数(我不确定如何确定,例如列是否应该总是大于或等于行?如果是这样,请选择#elements / chunk_size < chunk_size 的块大小)。 编辑: 也许选择chunk_size 这样chunk_size > Math.sqrt(#elements) && #elements % chunk_size === 0
  • 如果元素的数量是质数,您将始终必须使用单行。可以吗?

标签: javascript logic


【解决方案1】:

您可以使用Split array into chunks 中的解决方案来拆分元素数组。现在我们只需要确定正确的块大小。

看起来标准是:

  • 每个块的大小必须相同。这可以通过要求元素的数量被块大小(即#elements % chunk_size === 0)整除来实现。
  • 行数最多应与列数一样多。换句话说,块大小必须大于块的数量。我们可以从一个至少为 Math.sqrt(#elements) 的块大小开始来实现这一点。

// Implementation

function chunk (arr, len) {
  var chunks = [],
      i = 0,
      n = arr.length;

  while (i < n) {
    chunks.push(arr.slice(i, i += len));
  }

  return chunks;
}

function gridify(arr) {
  let size = Math.ceil(Math.sqrt(arr.length));
  while (arr.length % size !== 0) {
    size += 1;
  }
  return chunk(arr, size);
}

// Helper functions for example

function range(n) {
   return Array.from({length: n}, (_,i) => i+1);
}

function run(size) {
  console.log(JSON.stringify(gridify(range(size))));
}

// Create examples

run(4);
run(16);
run(3);
run(8);

希望有一种更好的方法来确定块大小,而不仅仅是迭代和增加大小,但这就是我在短时间内提出的。

【讨论】:

  • 问题的另一种表达方式是:找到#elements的最小因子,即&gt; Math.sqrt(#elements)
  • 谢谢,效果很好。有多重功能的原因吗?
  • 没有。我刚刚从另一个问题中复制了chunk
猜你喜欢
  • 2012-06-14
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 2012-11-16
相关资源
最近更新 更多