【问题标题】:Split array of integers based on step size in Javascript基于Javascript中的步长拆分整数数组
【发布时间】:2016-02-08 22:39:13
【问题描述】:

我编写了一个代码来根据步长将整数数组拆分为子数组(如果步长为空,它也应该包括在内)。我确定我的逻辑效率不高,如果有人有更好的解决方案,请帮助我。

var range = [10, 20, 20, 30, 100, 1000, 3420, 1124, 430, 700, 800,
  35, 39, 12, 5046
]
var rangeSplit = [];

var max = Math.max.apply(null, range);

var bucketSize = max / 25;
var tempArr = []
var tempBucket = 0;
while (tempBucket < max) {
  rangeSplit[bucketSize + tempBucket] = [];
  tempBucket += bucketSize;
}
for (var i = 0; i < range.length; i++) {
  var bucket = Math.ceil(range[i] / bucketSize)
  if (rangeSplit[bucketSize * bucket] == undefined) {
    rangeSplit[bucketSize * bucket] = [];
  }
  rangeSplit[bucketSize * bucket].push(range[i])
}

console.log(rangeSplit)

【问题讨论】:

  • 对于初学者来说,预期的结果是什么?不需要 5000 个元素,但基本轮廓会有所帮助
  • 您的脚本是否有效?如果您有工作代码并且正在寻找有关样式或效率的 cmets,codereview.stackexchange.com 是发布它的地方。 SO 适用于当您无法使其工作并需要帮助时。
  • 您在while 循环中创建的大多数元素都不是数组元素。除非max25 的倍数,否则bucketSize 将包含一个分数,并且数组索引必须是整数。所以你正在创建命名属性而不是数组元素。
  • 你应该使用rangeSplit[Math.ceil(bucketSize + tempBucket)]
  • 嗨@Barmar,我想这个问题应该去代码审查网站,我正在寻找我的解决方案是否好的答案或者我需要使用JS reduce函数,或者是否有更好的标准逻辑去做。

标签: javascript arrays math logic


【解决方案1】:

我不确定“如果步长为空,它还应该包括”是什么意思,如果你的意思是如果步长为空,它应该返回原始数组,你可以把这个条件放在开头函数,如if range === ''{ return arr; }

我把它写成一个函数,这样它会更通用,其中arr是你要切片的数组,range是步长的大小

    function chunkArrayInGroups(arr, range) {
     var aux = []; //the output

     for (var i = 0; i < (arr.length/range); i++){ // (arr.length/size) is the 
                                                 //number of chunks

      if ((size*i)%i === 0 || i === 0){ 
        aux.push(arr.slice((range*i), (range*(i+1))));
      }
     }
    return aux;
    }

//Try it like 
chunkArrayInGroups([0, 1, 2, 3, 4, 5], 2);

请记住,数组是从零开始的对象,因此您需要将 0 考虑在内,这就是为什么我在 if 语句中使用条件 if i==0

Slice function 返回一个数组块...它需要一个范围,就像函数一样。我希望这就是你要找的东西。

【讨论】:

  • 只是为了强调一个事实,即您在询问它是否是一种更好的方法......我认为与此类似的功能可能是一种更好的方法,也许有一些额外的边缘条件,我已经吃饱了知道用例,但它有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 2021-11-03
  • 2017-09-17
相关资源
最近更新 更多