阅读 138
每天一题,group拆分数组

每天一题,group拆分数组

这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战

每天一题,坚持思考

题目

实现group函数,把数组按照给定的num值长度划分成不同的小数组,并把这些小数组组合成一个数组返回。

group([1, 2, 3, 4, 5], 2); // [[1, 2], [3, 4], [5]]
group([2, 3, 5, 7], 3); // [[2, 3, 5], [7]]
复制代码

具体实现

// 判断参数args是否为数组类型,这里借用Object对象上的toString方法来进行判断
function isArray(args) {
  if (Object.prototype.toString.call(args) === '[object Array]') {
    return true;
  }
}

// 转换成整数类型
function toInt(num) {
  var resNum = num % 1;
  if (resNum) {
    num = num - resNum;
    resNum >= 0.5 && num++;
  }
  return num;
}

// group函数
function group(array, num) {
  // 判断num的值是否为数字类型;
  // num !== num 用来判断num为NaN的情况;
  // Infinity和-Infinity类型也是数字类型;
  if (typeof num !== 'number' || num !== num || (num === Infinity || num === -Infinity)) {
    num = 0;
  }
	
  // 转换成整数类型
  num = toInt(num);
	
  // 判断数组长度和num的值是否小于1
  var length = isArray ? array.length : 0;
  if (!length || num < 1) return [];

  var index = 0,
      resIndex = 0,
      result = [];
	
  // 这里使用slice拷贝部分数组
  while (index < length) {
    result[resIndex++] = array.slice(index, index += num);
  }

  return result;
}
复制代码

实现思路

参数:

  1. array(Array):需要被分拆的数组;
  2. num(Number): 每个被分拆后的小数组的长度;

步骤:

  1. 首先对num的类型进行处理,因为要求num是数字类型,所以用了typeof num === 'number'来进行数字类型判断;因为NaNtypeof返回值也是number,所以也要对它进行特殊处理,判断条件为num !== num,自身比较不相等;如果num的值是Infinity-Infinity也要进行处理;
  2. 因为存在小数的情况,所以也要对它进行处理,处理的方式使用求余1的方式,如果是整数,则返回0,否则返回小数点后的值。这里还对num的余数大于等于0.5的情况加1的处理,判断语句resNum >= 0.5 && num++;
  3. 使用isArray判断array的类型是否为数组,如果是,则获取array的长度,否则设置为0;当数组长度为0或者num的值小于1的情况,返回空数组;
  4. 最后使用while循环,利用数组方法slice进行复制小数组,起始位置就是当前的index,并且每一次复制的时候会把index的值加上num的值作为结束值;

如果读者发现有不妥或者可以改善的地方,欢迎在评论区指出。如果觉得写得不错或者对你有所帮助,可以点赞、评论、转发分享,谢谢~

文章分类
前端
文章标签