javascript - 迭代数组并对每个元素求和 1

标签 javascript arrays node.js

我在尝试解决数组问题时遇到了一些问题。好吧,我有一个这样的整数数组和一个要添加的 block :

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 个 block :

[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 个 block 时完成它。像这样:

    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 输入数组为结果时。

在您的示例中,当 block 为 1 时,您计算一些数组作为结果,当 block 为 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);
}

我解释的有点费劲,希望能帮到你!!!

关于javascript - 迭代数组并对每个元素求和 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58182391/

相关文章:

javascript - jQuery:幻灯片的自定义分页

javascript - DateRangeSlider 更改按钮单击时的最小格式绑定(bind)

c - 空格不应计入字符串长度

c++ - 使用 C++ 进行图像处理的有效方法是什么?

node.js - 尝试通过 Node createBlockBlobFromStream() 将 Blob 上传到 Azure 存储时出现“RequestBodyTooLarge”

javascript - 如何在jquery的drop方法中调用函数?

javascript - ThreeJS GLTFLoader 从 GLB 模型中获取顶点、边、面和三 Angular 形

javascript - 这个问题可以只用函数式编程解决吗?

node.js - 如何在 fs 回调方法中访问文件名?

node.js - 如果我只将 TypeScript 与 Node 一起使用,我可以将它转换为 ES6 吗?