例如,在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]]));
&#13;
但是这个解决方案有一件事我想改进:它创建一个新数组而不是修改原始数组。是否有任何解决方案可以修改数组的内容而不是创建一个类似于C ++版本的新数据?
我知道我无法直接通过javascript中的值传递原始类型,我可能需要这样的东西:
var obj={val:1};
var f=function(ob){
ob.val=2;
};
f(obj);
console.log(obj);
&#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
}
哪个可以替换原始数组中的元素?
答案 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);
中修改数组,因此您不需要创建和返回新数组,而只需使用可以改变它的函数来修改现有数组,例如splice
或push
。
<强>段:强>
square
&#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;
}