javascript - 迭代数组并对每个元素求和 1
问题描述
我在尝试解决数组问题时遇到了一些问题。好吧,我有一个这样的整数数组和一个要添加的块:
var model = [1,2,1,0,1]; var block = 1;
现在我必须给每个元素加 1 一次,我应该得到这样的结果:
[1,2,1,0,1] + [0,0,0,0,0] = [1,2,1,0,1]
[1,2,1,0,1] + [1,0,0,0,0] = [2,2,1,0,1]
[1,2,1,0,1] + [0,1,0,0,0] = [1,3,1,0,1]
[1,2,1,0,1] + [0,0,1,0,0] = [1,2,2,0,1]
[1,2,1,0,1] + [0,0,0,1,0] = [1,2,1,1,1]
[1,2,1,0,1] + [0,0,0,0,1] = [1,2,1,0,2]
结果应该是一个 5x5 的数组。当我必须添加超过 1 次的迭代时,问题会变得更加复杂。
var model = [1,2,1,0,1]; var block = 2;
现在我有相同的数组,但我必须以这种方式添加 2 个块:
[1,2,1,0,1] + [0,0,0,0,0] + [0,0,0,0,0] = [1,2,1,0,1]
[1,2,1,0,1] + [1,0,0,0,0] + [0,0,0,0,0] = [2,2,1,0,1]
[1,2,1,0,1] + [0,1,0,0,0] + [0,0,0,0,0] = [1,3,1,0,1]
[1,2,1,0,1] + [0,0,1,0,0] + [0,0,0,0,0] = [1,2,2,0,1]
[1,2,1,0,1] + [0,0,0,1,0] + [0,0,0,0,0] = [1,2,1,1,1]
[1,2,1,0,1] + [0,0,0,0,1] + [0,0,0,0,0] = [1,2,1,0,2]
[1,2,1,0,1] + [0,0,0,0,0] + [1,0,0,0,0] = [2,2,1,0,1]
[1,2,1,0,1] + [1,0,0,0,0] + [1,0,0,0,0] = [3,2,1,0,1]
[1,2,1,0,1] + [0,1,0,0,0] + [1,0,0,0,0] = [2,3,1,0,1]
[1,2,1,0,1] + [0,0,1,0,0] + [1,0,0,0,0] = [2,2,2,0,1]
[1,2,1,0,1] + [0,0,0,1,0] + [1,0,0,0,0] = [2,2,1,1,1]
[1,2,1,0,1] + [0,0,0,0,1] + [1,0,0,0,0] = [2,2,1,0,2]
. . . .
. . . .
. . . .
[1,2,1,0,1] + [0,0,0,1,0] + [0,0,0,0,1] = [1,2,1,1,2]
[1,2,1,0,1] + [0,0,0,0,1] + [0,0,0,0,1] = [1,2,1,0,4]
我有一个解决第一部分的函数,当我必须迭代 1 个块时我可以做到。像这样:
function iterateOneBlock(in_array){
n_out_array = [];
for(i=0; i<in_array.length; i++){
tmp_array = in_array;
tmp_array[i]++;
n_out_array[i] = tmp_array;
}
return n_out_array;
}
const myarray = [1,2,1,0,1];
var myarrayofarray = iterateOneBlock(myarray);
console.log(myarrayofarray);
解决方案
您也可以使用递归函数来做到这一点。在下面的代码中有 3 个简单的函数,
arsum(ar1,ar2)
计算两个数组的总和ar1
&ar2
getArr(n,i)
返回一个大小数组,n
其所有元素都为零,除了原位i
(即1
)
iterateNBlock(inArray, block)
是起点
calculate(arrayOfArray, block)
是递归函数。当block===0
输入数组是结果时。
在您的示例中,当块为 1 时,您计算一些数组作为结果,而当块为 2 时,您对所有这些数组执行操作,对第一个数组执行的操作。
所以对于block=n
你做同样事情时的结果block=n-1
。
function arsum(ar1, ar2){
let sum = [];
for(let i=0; i<ar1.length; i++){
sum.push(ar1[i]+ar2[i]);
}
return sum;
}
function getArr(n,i){
let ar = new Array(n).fill(0);
if(i>=0 && i<ar.length)
ar[i]=1;
return ar;
}
function calculate(arrayOfArray, block){
if(block===0)return arrayOfArray;
let n = arrayOfArray[0].length;
let next = [];
for(let i=-1; i<n; i++){
let ar = getArr(n, i);
for(let j=0 ; j<arrayOfArray.length; j++){
next.push(arsum(arrayOfArray[j], ar));
}
}
return calculate(next, block-1);
}
function iterateNBlock(inArray, block){
return calculate([inArray], block);
}
有点难解释,希望能帮到你!!!
推荐阅读
- html - 如何在 CSS 中除最后一页之外的每一页上打印页脚文本?
- vba - Excel add and copy row values based on the amount of matches
- portlet - 如何在 DXP for OOTB portlet 中为属性“com.liferay.portlet.display-category”分配多个值?
- objective-c - Return NSArray function from asynchronous BLOCK
- javascript - Ajax call does not return json into website body
- ubuntu - 如何在 Ubuntu 上安装 Impala?
- python - How do you merge two unequal input/list in Python3
- flutter - Get current tab of DefaultTabController
- azure-devops - How to expand all properties in returned release definition
- vb.net - How to do Loop to calculate the cell values in DataGridView?