【问题标题】:How to modify elements of primitive types in array recursion function?如何在数组递归函数中修改原始类型的元素?
【发布时间】:2018-02-06 03:17:04
【问题描述】:

例如,在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 中我可以返回一个新修改的数组:

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]]));

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

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

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

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

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
} 

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

【问题讨论】:

  • 你想做的事可以通过JavaScript来完成。查看我的answer 以了解如何做到这一点。

标签: javascript arrays recursion


【解决方案1】:

您可以修改JavaScript 中的数组,因此您不需要创建和返回新数组,只需使用可以改变它的函数来修改现有数组,例如splicepush

片段:

/* 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);

注意:你仍然需要在square函数中返回数组,否则函数在递归执行时将无法按预期工作。

【讨论】:

    【解决方案2】:

    如果你直接写入 v 数组而不是推送到 v2 数组,那将完成你所追求的

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 2020-05-04
      • 2018-02-18
      相关资源
      最近更新 更多