如何在数组递归函数中修改基本类型的元素?

时间:2018-02-06 03:17:04

标签: javascript arrays recursion

例如,在c ++中,我想要一个函数以相同的方式修改不同的向量深度,我可以:

#include <stdio.h>
#include <vector>
template <typename V>
void f(V& v){
    for(auto& e : v)
        f(e);
    printf("\n");
}

template <>
void f(int& v){
    v=v*v;
}

int main(){
    std::vector<int> v1={1,2};
    f(v1);
    for(int& i : v1)
        printf("%d ",i);
    printf("\n");

    std::vector<std::vector<int> > v2={{3,4},{5,6,7}};
    f(v2);
    for(std::vector<int> v : v2){
        printf("[");
        for(int& i : v)
            printf("%d ",i);
        printf("]");
    }
    return 0;
};

将矢量中的数字平方:

1 4
[9 16 ][25 36 49 ] 

在javascript中我可以返回一个新修改的数组:

&#13;
&#13;
var f=function(v){
  if(Array.isArray(v)){
    var v2=[];
    for(var i=0;i<v.length;i++)
      v2.push(f(v[i]));   
    return v2;
  }else
    return v*v;
}
console.log(f([1,2]));
console.log(f([[3,4],[5,6,7]]));
&#13;
&#13;
&#13;

但是这个解决方案有一件事我想改进:它创建一个新数组而不是修改原始数组。是否有任何解决方案可以修改数组的内容而不是创建一个类似于C ++版本的新数据?

我知道我无法直接通过javascript中的值传递原始类型,我可能需要这样的东西:

&#13;
&#13;
var obj={val:1};
var f=function(ob){
  ob.val=2;
};
f(obj);
console.log(obj);
&#13;
&#13;
&#13;

但我不知道如何在我的情况下应用上述技术。有没有这样的解决方案:

var f=function(v){
  if(Array.isArray(v)){
    for(var i=0;i<v.length;i++)
      f(v[i]);   
  }else
    //replace v with v*v
} 

哪个可以替换原始数组中的元素?

2 个答案:

答案 0 :(得分:0)

您可以在/* The squaring function. */ var square = function(v) { if (Array.isArray(v)) { for(var i = 0, l = v.length; i < l; i++) { /* Remove the current element and add its square in its place. */ v.splice(i, 1, square(v[i])); } return v; } else return v * v; } /* Create a sample array and log it. */ var original = [1, 2, 3]; console.log(original); /* Square the values of the array and log it */ square(original); console.log(original);中修改数组,因此您不需要创建和返回新数组,而只需使用可以改变它的函数来修改现有数组,例如splicepush

<强>段:

&#13;
&#13;
square
&#13;
&#13;
&#13;

注意:您仍然必须在@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == 0 && resultCode == RESULT_OK) { Uri resultUri = data.getData(); saveFile(resultUri); } } 函数内返回数组,否则函数在递归执行时不会按预期工作。

答案 1 :(得分:-1)

如果不是推送到v2阵列,而是直接写入v阵列,那将完成你的目标

var f = function(v){
  if(Array.isArray(v)){
    for(var i=0;i<v.length;i++)
      v[i] = f(v[i]);
    return v;
  }else
    return v*v;
}