js面试之随机数组每8个字符长度进行分割

示例数组
const arr = [ 1234, 1234, 1234567, 12, 12, 12, 123456789999, 456, 9345, 56798987, 9999999999];
分割结果

const newArr = [
  [ '1234', '1234' ],
  [ '1234567' ],
  [ '12', '12', '12' ],
  [ '123456789999' ],
  [ '456', '9345' ],
  [ '56798987' ],
  [ '9999999999' ]
]

方法一 较完善,支持任意长度的字符串

// let arr = [
//   7, 43, 45, 14, 19, 33, 21, 44, 12, 41, 29, 49, 30, 50, 39, 34, 11, 26, 23, 27,
//   3, 2, 51, 35, 42, 36, 20, 32, 13, 28, 17, 5, 52, 25, 48, 18, 1, 10, 46, 37, 9,
//   40, 22, 6, 31, 24, 8, 47, 15, 16, 38, 14,
// ];
const arr = [
  1234, 1234, 1234567, 
  12, 12, 12, 123456789999,
  456, 9345, 56798987,
  9999999999, 34, 5677,
];
// 定义二维数组
let newArr = [];
// 定义截取开始索引,默认为0
let startIndex = newArr.length;

function cutArray(oldArray, array, size) {
  const list = array.length ? array.slice() : oldArray.slice();
  // 转换为字符串方便处理数据
  const newArray = list.map((item) => item.toString());
  let str = '';
  let childArray = [];
  // 循环push子数组
  for (let index = 0; index < newArray.length; index++) {
    const element = newArray[index];
    str = str + element;
    childArray.push(element);
    if (str.length > size) {
      break;
    }
  }
  // 如果拼接字符串总长度大于8,则删除最后一次添加的元素
  str.length > size && childArray.length > 1 ? childArray.pop() : childArray;
  // console.log('childArray', childArray);
  newArr.push(childArray);
  startIndex = newArr.flat().length > 0 && newArr.flat().length;
  // console.log('startIndex', startIndex, str.length)
  const nextArray2 = oldArray.slice(startIndex);
  // console.log('nextArray2', nextArray2, startIndex);
  // 循环未完成递归调用
  if (oldArray.length !== newArr.flat().length) {
    cutArray(oldArray, nextArray2, size);
  }
}
// cutArray(arr, [], 8);
cutArray(arr, [], 9);
// console.log('arr', arr)
console.log('newArr', newArr);

方法二 有严重缺陷

const arr = [ 1234, 1234, 1234567, 12, 12, 12, 123456789999, 456, 9345, 56798987, 9999999999];
const tempArr = arr.map((item) => item.toString());

let newArr = tempArr.slice();
let level2Arr = [];
const changeArr = (list) => {
  let subArr = [];
  let str = '';
  let current = 0;
  // console.log(list, 'tempArr')
  for (let index = 0; index < list.length; index++) {
    const element = list[index];
    
    if (element.length >= 8) {
      subArr = [element];
      current = index + 1;
      // console.log('subArr first', subArr);
      level2Arr.push(subArr);
      // 递归调用新数组
      const nextArr = list.slice(current);
      if (nextArr.length > 0) {
        changeArr(nextArr);
      }
      break;
    } else {
      str = str + element;
      // console.log('str', str)
      // 此处有更多可能性,目前只满足大于6小于8, 有兴趣的可以研究下
      if (str.length >= 6 && str.length <= 8) {
        current = index + 1;
        // subArr = element.length >= 5 ? [element] : list.slice(0, index + 1);
        subArr = list.slice(0, current);
        // console.log('subArr second', subArr);
        level2Arr.push(subArr);
        // 递归调用新数组
        const nextArr = list.slice(current);
        if (nextArr.length > 0) {
          changeArr(nextArr);
        }
        break;
      }
    }
  }

  return level2Arr;
};
// changeArr(newArr);
const list2 = changeArr(tempArr);

console.log(list2);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值