【问题标题】:splitting array of items based on variable value [duplicate]基于变量值拆分项目数组[重复]
【发布时间】:2021-06-09 21:58:56
【问题描述】:

我有下面的js代码:

let splits = 23;

        

let outer_bound_value = 0;
let data = //this is an array of a large number of predefined objects (10,200+)

 for (i = 0; i < data.length; i = i + outer_bound_value) {
   
   outer_bound_value = data.length / splits;
   let split_arr = array.slice(i, i + outer_bound_value);
   
 }

此代码的预期结果是能够根据 splits 的值将巨型数组拆分为较小的数组(如果 splits 为 5,则将大数组拆分为 5 个部分)。我认为我上面的方法可行,但它依赖于能够进入对象长度的拆分,并且可能导致越界错误。有人有更有效的方法来做我想做的事吗?

【问题讨论】:

  • 为什么要在for循环中计算outer_bound_value?如果您需要将 N 个元素的列表分成 M 个段,则每个段的长度为 floor(N/M),除了最后一个(可能还有 1 个元素):您在开始 for 循环之前已经知道长度。跨度>
  • @Mike'Pomax'Kamermans 你介意编辑我的代码以便我明白你的意思吗?
  • 只要 i 小于数组长度,如果 slice() 的最终值超过长度,它就会正确处理它并且只返回可用的 console.log([1,2,3,4].slice(1, 100))

标签: javascript arrays csv sorting


【解决方案1】:

首先将数组除以所需的拆分数量。

通常我会使用 new Set(),因为它比使用 slice 拆分数组要快得多,但是我不知道您的数组中有什么类型的数据,集合在整数方面是独一无二的。

我们使用递归和解构来返回切片数组。这会将多个数组返回到数组长度/拆分中。

const splits = 23;

const data = new Array(10000);
const chunkValue = Math.floor(data.length/splits);

function chunkArray(array, size) {
   if(array.length <= size){
       return [array]
   }
   return [array.slice(0,size), ...chunkArray(array.slice(size), size)]
}

const newArrays = chunkArray(data, chunkValue)

【讨论】:

  • @Mike'Pomax'Kamermans 是只返回一个数组还是每个数组?
  • @Juliette 更新了答案以解释发生了什么。但是是的,它返回多个数组,
猜你喜欢
  • 2012-11-30
  • 1970-01-01
  • 2020-09-01
  • 2011-11-27
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
相关资源
最近更新 更多