2016-12-15 196 views
1

我有两个函数,其中1个将对象推入数组。它调用另一个函数,该函数从对象中删除键并仅存储数组中的值。Javascript范围未设置全局变量

但是,它没有将预期的结果设置到全局数组,我将使用它来处理其余的代码。

 var arr1 = []; 
 
     
 
    function foo(callback){ 
 
     arr1.push({id: 1},{id: 2}); 
 
     console.log(JSON.stringify(arr1)); 
 
    
 
     callback(arr1); 
 
    } 
 
     
 
    foo(function(arr1){ 
 
     \t bar(arr1); 
 
    }); 
 
    
 
    function bar(arr1){ 
 
    \t arr1 = arr1.map(x => x.id); 
 
     console.log(JSON.stringify(arr1)); 
 
    } 
 

 
    console.log(JSON.stringify(arr1)); // I want the result to be [1,2]

我可以无视第二个函数,并把它的所有内容到第一个功能,但是这会使事情变得凌乱,因为在我的实际代码库,功能也相当复杂。那么有什么方法可以解决这个问题吗?

+0

这就是它是如何工作的,因为你传递数组的值到一个被更新的局部变量。你可以看看你应该在这里做什么:https://jsfiddle.net/hkwg04py/ –

+0

@BrettJeffreson但我必须通过我的情况下的数组。否则,这是没用的 – marukobotto

+0

为什么你在这里使用回调概念。你可以在没有它们的情况下做到这一点,并使你的代码简单并达到你想要的,就像我在下面的答案中所展示的一样。 –

回答

0

您可以像这样使用json对象来隔离范围,而不必在全局范围内有“变量名称”依赖性。

 var arr1 = {arr: []}; 
 
     
 
    function test1(callback){ 
 
     arr1.arr.push({id: 1},{id: 2}); 
 
     console.log(JSON.stringify(arr1.arr)); 
 
    
 
     callback(arr1); 
 
    } 
 
     
 
    test1(function(arr1){ 
 
     \t test(arr1); 
 
    }); 
 
    
 
    function test(arr1){ 
 
    \t arr1.arr = arr1.arr.map(x => x.id); 
 
     console.log(JSON.stringify(arr1)); 
 
    } 
 

 
    console.log(JSON.stringify(arr1.arr)); // I want the result to be [1,2]

+2

当“_JavaScript不支持参数reference_”参数时,怎样才能通过'test(arr1)'修改全局'arr1'? –

+1

你有权利,我纠正了答案。我在想“原始的”,但不是这种情况。 thk –

0

目前尚不清楚是你的代码封闭范围,这可能导致在未来的问题,但是如果你的设计真的需要这样的决定 - 在这里你可以把工作示例

var arr1 = []; 
 
      
 
function test1(a, callback){ 
 
    a.push({id: 1},{id: 2}); 
 
    console.log('1', JSON.stringify(arr1)); 
 

 
    callback(a); 
 
} 
 

 
test1(arr1, function(a){ 
 
    test(a); 
 
}); 
 

 
function test(a){ 
 
    //better do not use, but it works 
 
    arr1 = a = a.map(x => x.id); 
 
    console.log('2', JSON.stringify(a)); 
 
} 
 

 
console.log('3', JSON.stringify(arr1)); // I want the result to be [1,2]

0

为什么你不能让你的代码更简单,这样做下面

var arr1 = []; 
 
var arr2 = []; 
 
     
 
function test1(arr){ 
 
    arr.push({id: 1},{id: 2}); 
 
    return arr; 
 
} 
 
    
 
function test(ar){ 
 
    ar = arr1.map(x => x.id); 
 
    return ar; 
 
} 
 

 
var array1 = test(test1(arr1)); 
 
console.log(JSON.stringify(array1)); // I want the result to be [1,2] 
 

 
var array2 = test(test1(arr2)); 
 
console.log(JSON.stringify(array2)); // I want the result to be [1,2]

+0

如果有超过1个阵列会怎么样?那么你如何编写'test1'? – marukobotto

+0

你的意思是说你想将多个数组传递给'test1',然后在它们内部推入对象并返回,然后进一步处理? –

+0

是的。如果有多个阵列,那么你将如何返回? – marukobotto

0

如果它是一个全局变量,存在将它作为参数等功能是没有意义的。你可以做到这一点。

var arr1 = []; 

    function test1(callback){ 
     arr1.push({id: 1},{id: 2}); 
     console.log(JSON.stringify(arr1)); 

     callback(); 
    } 

    test1(function(){ 
     test(); 
    }); 

    function test(){ 
     arr1 = arr1.map(x => x.id); 
    } 

    console.log(JSON.stringify(arr1)); 

你实际上并不在test()代替全局变量arr1的价值,你替换在的test()局部范围存在的arr1值。

+0

总是有一点要传递,就像我说的那样,函数是复杂的,我必须在我的函数中使用局部变量并将其设置为全局。 – marukobotto

1

我不会质疑你的设计 - 听起来你不得不简化一些复杂的代码。虽然其他答案提供了一个可行的替代解决方案,但它并不能解释原因。

JS参数不是“out” - 大致转换为C,它们仅仅是指针,而不是指向指针的指针。如果替换函数内部的参数值(由map结果执行),修改将保留在函数范围内。如果你想修改出来的功能,适用于任何其他的答案提出的方法:

  • 包裹的参数要被修饰成复合物
  • 作出改动返回值 - 无论是简单的还是在一个临时组合对象
  • 做出修改回调参数

有没有办法解决它,真的。JS没有语法,也不支持输出参数。

2

使JSON对象的数组后,那么你可以写如下的代码来获取ID的阵列将用于工作,你

var arr = [ {id: 1, data: "data1"}, 
       {id: 2, data: "data2"}]; 

var id_array = Object.keys(arr).map(function (k) { 
       return arr[k]['id'].toString(); 
      });