2009-12-08 103 views
1

我想實現一個算法,我發現在C#中的JavaScript中,並面臨一些問題。將C#移植到JavaScript導致範圍問題

基本上我發現很難在JS中通過引用傳遞。我已經破裂的問題,我有以下示例代碼,讓說你有下面的C#:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      wordPoco[] myArray = new wordPoco[4] { 
       new wordPoco {word="This"}, 
       new wordPoco {word="is"}, 
       new wordPoco {word="a"}, 
       new wordPoco {word="test"}}; 

      Console.WriteLine("Values Before Recursion"); 
      MyRecursiveFunction(ref myArray); 

      Console.Read(); 
     } 

     private static void MyRecursiveFunction(ref wordPoco[] myArray) 
     { 
      if (myArray.Length <= 0) { 
       Console.WriteLine(); 
       Console.WriteLine("Values After Recursion"); 
       return; 
      } 

      wordPoco[] newArray = (wordPoco[])myArray.Clone(); 

      Console.Write("ArrayValue: "); 
      for (int j = 0; j < newArray.Length; j++) 
      { 
       Console.Write(newArray[j].word + " "); 
      } 
      Console.WriteLine(); 

      //popping in js 
      wordPoco[] poppedArray = new wordPoco[newArray.Length - 1]; 
      Array.Copy(newArray, poppedArray, newArray.Length - 1); 

      newArray = (wordPoco[])poppedArray.Clone(); 

      MyRecursiveFunction(ref newArray); 

      myArray = (wordPoco[])newArray.Clone(); 

      Console.Write("ArrayValue: "); 
      for (int j = 0; j < myArray.Length; j++) 
      { 
       Console.Write(myArray[j].word + " "); 
      } 
      Console.WriteLine(); 
     } 
    } 

    public class wordPoco { 
     public string word; 
    } 
} 

產生的輸出:

Values Before Recursion 
ArrayValue: This is a test 
ArrayValue: This is a 
ArrayValue: This is 
ArrayValue: This 

Values After Recursion 
ArrayValue: 
ArrayValue: 
ArrayValue: 
ArrayValue: 

不應在以下JS產生相同結果?

$(document).ready(function() { 

    var debugBox = $("#debug"); 
    var myArray = [{ word: "This" }, { word: "is" }, { word: "a" }, { word: "test"}]; 

    debugBox.append("<b>Values Before Recursion</b><br/>"); 
    MyRecursiveFunction(myArray); 

    function MyRecursiveFunction(myArray) { 
     if (myArray.length <= 0) { debugBox.append("<b>Values After Recursion</b><br/>"); return false; } 

     var newArray = $.extend(true, [], myArray); 

     debugBox.append("ArrayValue: "); 
     for (var j = 0; j < newArray.length; j++) 
      debugBox.append(newArray[j].word + " " ); 
     debugBox.append("<br/>"); 

     newArray.pop(); 
     arguments.callee(newArray); 

     myArray = $.extend(true, [], newArray); 

     debugBox.append("ArrayValue: "); 
     for (var j = 0; j < myArray.length; j++) 
      debugBox.append(myArray[j].word + " "); 
     debugBox.append("<br/>"); 
    } 
}); 

我得到的結果卻是:

Values Before Recursion 
Value: This is a test 
Value: This is a 
Value: This is 
Value: This 
Values After Recursion 
Value: 
Value: This 
Value: This is 
Value: This is a 

非常感謝您的時間, 凱文

回答

2

最簡單的答案是,它不是一個空洞的方法更改爲其中之一返回數組。

所以C#聲明將變爲:

private static wordPoco[] MyRecursiveFunction(wordPoco[] myArray) 

當你遞歸你會怎麼做:

newArray = MyRecursiveFunction(newArray); 

和你只是在方法的最後返回myArray

這將使不使用傳遞引用而輕鬆移植。

+0

感謝您的回答, 不幸的是,這不會工作,因爲我從C#移植的算法,通過引用傳遞多個數組。 – Kevin 2009-12-08 19:23:14

+0

我想我可以去捆綁他們陣列在一起,並返回大對象,但理想情況下,我不想這樣... – Kevin 2009-12-08 19:24:32

+1

@Kevin:這聽起來不像是非常漂亮的代碼。參考參數應該比較少見......聽起來你應該把它們封裝在一起。 – 2009-12-08 19:50:33