给一维数组中的连续数分组

程序不仅仅是存储数据,通常具备描述数据关系(数据结构),操作数据行为(算法)。
本文演示一维数组通过reduce 方法转二维,达到符合需求改变数据关系的小程序。

问题

实现一个方法,将一维数组内的连续序列,变成该数组内的二维数组元素

// 输入 
[1,1,1,2,3,4,5,8,10,22,24,25,26,66]
// 输出
[1,1,[1,2,3,4,5],8,10,22,[24,25,26],66]

思路

借用数组的原型方法reduce,依次累计求值得到一个新数组

  1. 查找出所有连续元素
  2. 在本连续子序列第一次出现的连续元素时,创建二维数组
  3. 依次将每个源数组元素根据是否连续分别加入新数组的二维数组元素或一维数组队尾

实现

Array.prototype.reduce() 原型方法

arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])

回调callback 参数 accumulator (acc) 当前累计器参数,initialValue 初始化累计值
current Value (cur) 当前值 current Index (idx) 当前索引 source Array (src) 源数组

function reducer (acc, v, i,arr) {
    // 1.过滤所有连续数
    if ((arr[i + 1] - arr[i] == 1) || (arr[i] - arr[i - 1] == 1)) {
        // 2.创建二维数组
        if (i == 0 || arr[i] - arr[i - 1] != 1) {
            acc.push([])
        }
		// 3.向二维数组内追加元素
        acc[acc.length - 1].push(v)
    } else {
        // 4.一维数组项继续加入不连续数
        acc.push(v)
    }
    return acc
}

测试

var arr = [4, 1, 1, 1, 2, 3, 4, 5, 8, 10, 22, 24, 25, 26, 66, 67]
console.log(arr.reduce(reducer,[]))

结果

 [ 4, 1, 1, [ 1, 2, 3, 4, 5 ], 8, 10, 22, [ 24, 25, 26 ], [ 66, 67 ] ]

扩展

此例主要是考虑到了源序列顺序未变,遇到连续数则就地重组追加,
亦可使用for循环+指针计算连续起始索引,结合slice 方法得到想要的结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值