JS 实现二维数组横纵合并并求平均 算法

原创文章。转载请注明原链接:https://www.cnblogs.com/justif/p/10929395.html
const arr = [ [1,2,3,4,5,6,7,8,9,10], [1,2,3,4,5,6,7,8,9,10], [1,2,3,4,5,6,7,8,9,10], [1,2,3,4,5,6,7,8,9,10], ] 将数组进行横纵项的合并求平均值。例如横纵合并2项,结果应为: [ [1.5, 3.5, 5.5, 7.5, 9.5], [1.5, 3.5, 5.5, 7.5, 9.5], ]。

思路:
1.因为要合并的横纵排列数可能不能被原数组的排列总数整除,所以要进行补零操作。即横排增加 每一项全为0的数组,纵列上的已有数组增加0.
2.得到补0后的数组,将横纵长度除以要合并的横纵长度。即可以得到结果数组的横纵长度。从而可利用new Array生成一个每一项想为0的临时结果数组。
3.即为下面实现的 buildArr方法。得到补0数组,进行双重循环,得到每一项的横纵坐标,再除以要合并的横纵长度,向下取整,即可得到临时结果数组的坐标,进行补0数组的值的累加。
 如果当前的横纵列数+1可整除要合并的横纵长度,说明已累加完毕当前要合并的值,然后除以合并长度相乘,即可得到平均值。
调用:
Petter.getTheArr(arr,2,2);

实现:
//利用补0数组的二维长度除以要合并的长度,得到结果数组的横纵坐标直接进行计算
//通过Array.fill创建的二维数组要进行深拷贝,因为fill的是对象时,哪怕是new出来的,也会每次填入同一地址的对象。

Petter = {
    getTheArr: (arr, row, coloum) => {
        let copyArr = JSON.parse(JSON.stringify(arr)),
            pArr = Petter.perfectedArr(copyArr, row, coloum),//补0后的数组
            resultArr = new Array(pArr.length / row).fill(new Array(pArr[0].length / coloum).fill(0)),//创建结果数组并先填充0
            result = Petter.buildArr(resultArr, pArr, row, coloum);
        console.log(result);
        return result; }, //数组补0 perfectedArr: (arr, row, coloum) => { let coloumsLength = arr[0].length, rowLeft = arr.length % row; if(rowLeft !== 0) { arr = [...arr, ...new Array(Math.abs(row-rowLeft)).fill(new Array(coloumsLength).fill(0))]; } let coloumLeft = coloumsLength % coloum; if(coloumLeft !== 0) { arr = arr.map(item => { item.push(...new Array(Math.abs(coloum - coloumLeft)).fill(0)); return item; }) } console.log('-------------补0后的数组---------------') console.log(arr); return arr; }, buildArr: (resultArr, pArr, row, coloum) => { let copyArr = JSON.parse(JSON.stringify(resultArr)); pArr.forEach((rowItem, rowI) => { rowItem.forEach((colItem, colI) => { copyArr[Math.floor(rowI/row)][Math.floor(colI/coloum)] += colItem; if((rowI+1)%row === 0 && (colI+1)%coloum === 0) { copyArr[Math.floor(rowI/row)][Math.floor(colI/coloum)] = (copyArr[Math.floor(rowI/row)][Math.floor(colI/coloum)] / (row * coloum)).toFixed(1); } }) }) return copyArr; } }

转载于:https://www.cnblogs.com/justif/p/10929395.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值