VueJS:如何返回 3 个新数组,每个数组中的项目数量相等,除了最后一个数组?

Posted

技术标签:

【中文标题】VueJS:如何返回 3 个新数组,每个数组中的项目数量相等,除了最后一个数组?【英文标题】:VueJS: How to return 3 new arrays with equal amount of items in each, except for the last array? 【发布时间】:2021-10-25 18:45:08 【问题描述】:

我正在使用 Bootstrap5 和 VueJS 2 并尝试创建一个“pinterest 风格”的卡片布局,如下图所示:

上面的布局示例需要以下 html 标记: [Codesandbox available]

<main>
    <div class="container-fluid">
        <div class="row">
           <div class="col-md-9">
                <div class="row">
                      <div class="col-md-4">
                        <article>
                        </article>
                        <article>
                        </article>
                      </div>
                      <div class="col-md-4">
                        <article>
                        </article>
                        <article>
                        </article>
                      </div>
                      <div class="col-md-4">
                        <article>
                        </article>
                        <article>
                        </article>
                      </div>
           </div>
        <aside class="col-md-3 ml-auto">
           ...sidebar content...
        </aside>
        </div>
    </div>
</main>

使用 JavaScript,如何获取数据数组并返回 3 个新数组,每个数组中除最后一个数组外的项目数量相等?这样我就可以正确地使用上面屏幕截图中所示的输出来构建布局?因此,例如,如果我有一个[1,2,3,4,5,6,7,8,9,10,11] 的源数据数组,我想返回类似[ [1,2,3,4], [5,6,7,8], [9,10,11] ]

我对此进行了初步尝试(在 VueJS 中),但我显然没有正确地做到这一点,因为虽然我的布局有点工作,但顺序是错误的,并且在一些卡片下方有间隙。恐怕我的 javascript 知识很一般。 我的尝试:https://codesandbox.io/s/vue-bootstrap-card-layout-0xjlt?file=/src/App.vue

【问题讨论】:

这可能有用:***.com/questions/8495687/split-array-into-chunks 试过类似的方法,但是如何指定我只想返回 3 个子数组? 看看这个_.chunk() in lodash,它正是你想要的lodash.com/docs/4.17.15#chunk 您可以确定chunk 的大小除以array.length 并计算结果上限:chunk = Math.ceil( array.length / 3); @AdilBimzagh:谢谢,你是对的。有什么理由使用 Lodash 库而不是下面发布的答案? 【参考方案1】:

您非常接近,但是要获得正确的块数,请除以所需的列数并获得项目数的上限...

Math.ceil(this.mockData.length / 3)
  computed: 
    chunkArray() 
      let result = [];
      const size = Math.ceil(this.mockData.length / 3);
      for (let i = 0; i < this.mockData.length; i += size) 
        let chunk = this.mockData.slice(i, i + size);
        result.push(chunk);
      
      return result;
    ,
  ,

Codesandbox

【讨论】:

谢谢!这确实回答了我的问题,我会将其标记为“已解决”,但我没有考虑的一件事是订购。订单现在是垂直的。可以让它水平吗?【参考方案2】:

如果您希望订单是“水平的”,例如:

[[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9]]

然后需要稍微不同的方法。您只需遍历将每个项目推入适当的子阵列(很像将一副扑克牌发给三个人)。

computed: 
  chunkArray() 
    let result = [];
    const cols = 3;
    this.mockData.forEach((item, index) => 
      let i = index;
      // determine the index of the destination sub-array 
      while (i >= cols) 
        i -= cols; // i will be 0, 1, or 2
      
      // create the sub-array if needed
      if (!Array.isArray(result[i])) 
        result[i] = [];
      
      // put the item in the sub-array
      result[i].push(item);
    )

    return result;
  ,
,

https://codesandbox.io/s/vue-bootstrap-card-layout-forked-cj0w1?file=/src/App.vue:7492-7847

【讨论】:

正在研究这个...我会回复你的。谢谢! 这个网格层非常适合中等断点和更高的断点。但是,对于具有单列视图的小屏幕,排序是随机的。是否可以将数组项订购回 [1, 2, 3, 4, 5, 6....etc] 这基本上是上面@zim的答案?我可以为此提出一个新问题,只是想知道它是否首先可能。谢谢!

以上是关于VueJS:如何返回 3 个新数组,每个数组中的项目数量相等,除了最后一个数组?的主要内容,如果未能解决你的问题,请参考以下文章

vuejs:根据每个循环的 vuejs 中数组中的 2 个变量更改 <div> 的宽度

Vuejs2 - 如何将两个数组中的元素与计算属性进行比较?

js中[ ].push(1,2,3)为啥是3而不是个新数组

js中[ ].push(1,2,3)为啥是3而不是个新数组

如何从带有组件的 vuejs 返回一个普通数组?

如何从返回的数据组件 vuejs 中拼接一个子数组?