原創文章。轉載請注明原鏈接: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; } }