【发布时间】: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