2012-11-05 94 views
0

不確定爲什麼我一直未定義這個結果,任何幫助都會很好。結果是假設開始時x值爲數組。感謝值保持返回爲undefined

var tester = [1,2,4]; 
Array.prototype.cons = function(x){ 
    function reduce(results,y){ 
     if(y == 1){ 
      results.unshift(x); 
      return results; 
     } 
     else{ 
      results.push(this[y-1]); 
      y = y-1; 
      reduce(results, y); 
     } 
    } 
    return reduce([], this.length); 
} 
document.getElementById('test').innerHTML = tester.cons(0) 
+0

檢查'this'值在'reduce'功能...它不是你所期望不亮*此*行其不能再封閉 – ManseUK

+0

什麼'results.push(this [y-1]);' – ManseUK

回答

0

您設計您的reduce功能回報的結果,但在你的就recusive呼叫

else{ 
    results.push(this[y-1]); 
    y = y-1; 
    reduce(results, y); // <--- HERE 
} 

你是不是做與返回的任何有價值的東西(如返回它的堆棧)。這意味着評估會繼續執行您的功能,其底部沒有return聲明。在JavaScript中,不返回語句意味着函數調用的返回值將爲undefined

+0

@ManseUK是的,但他只返回堆棧的那個層次。他可能有幾個層次。 – Matt

+0

對不起,我做了一些測試後刪除了我的評論!就像你添加了你的評論,我想! – ManseUK

0

如果您只是試圖將數組中的某個元素移動到前面,則可以簡單地使用它而不是遞歸地通過陣列。

var tester = [1,2,4]; 
Array.prototype.cons = function(x){ 
    // Copy the array. This only works with simple vars, not objects 
    var newArray = this.slice(0);   

    // Check to make sure the element you want to move is in the array 
    if (x < this.length) { 
     // Remove it from the array 
     var element = newArray.splice(x, 1); 
     // Add to the beginning of the array 
     newArray.unshift(element); 
    } 
    return newArray; 
} 
document.getElementById('test').innerHTML = tester.cons(4)​;​ 

編輯:取得的數組的副本