原创文章。转载请注明原链接: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