2014-03-04 279 views
0

我有簡單的數組[3,7,9],我嘗試以遞歸方式搜索某些值。如果要搜索的值不存在,它將被添加到數組中,否則不會。我正在使用開關盒結構,但面臨嚴重問題。javascript switch語句跳回

首先搜索值2.一切都很好,直到函數返回。由於某些原因代碼跳回到休息狀態;在「情況a:」中的行。然後將itemFound設置爲'undefined'。爲何發生這種跳躍?

搜索值5跳回去;在「情況b:」中,並且再次itemFound獲得值「未定義」。

與其他值有更多的跳躍。

我確實希望代碼只做一個開關櫃並退出條件。

myArr = [3, 7, 9]; 

window.onload = init; 

function init() { 

    searchItem(myArr, 2); 
    searchItem(myArr, 5); 
    searchItem(myArr, 8); 
    searchItem(myArr, 10); 
    searchItem(myArr, 7); 

    var arrLength = myArr.length; 
    for (var i = 0; i < arrLength; i++) { 
     console.log('index ' + i + ' ' + myArr[i]); 
     // alert(myArr); 
    } 
} 

function searchItem(array, itemToSearch) { 
    var itemFound; 
    var itemArray = array.slice(0); 
    var arrLen = itemArray.length; 
    var midPointIndex = Math.round(itemArray.length/2) - 1; 
    var midPointVal = itemArray[midPointIndex]; 

    switch (true) { 

     //case a: 
     case midPointVal < itemToSearch: 
      if (arrLen > 1) { 
       itemArray.splice(0, midPointIndex + 1); 
       searchItem(itemArray, itemToSearch); 
      } else { 
       itemFound = false; 
      } 
      break; 

     //case b: 
     case midPointVal > itemToSearch: 
      if (arrLen > 1) { 
       itemArray.splice(midPointIndex, arrLen - midPointIndex); 
       searchItem(itemArray, itemToSearch); 
      } else { 
       itemFound = false; 
      } 
      break; 

     //case c: 
     case midPointVal === itemToSearch: 
      itemFound = true; 
      break; 
    } 

    if (itemFound === false) { 
     myArr.push(itemToSearch); 
     myArr.sort(); 
     //arraySort(myArr); 
    } 


    console.log('Value ' + itemToSearch + ' found' + ': ' + itemFound); 

    return itemFound; 
} 
+0

@Andy:顯然他期望數組被排序。 – Bergi

回答

0

出於某種原因碼跳轉回破;在「情況a:」中的行。然後將itemFound設置爲'undefined'。爲何發生這種跳躍?

因爲return在調用堆棧上跳回一級。你在函數內部沒有遇到跳轉,而是從遞歸調用跳轉到它被調用的地方 - 並且itemFound仍未定義。

我嘗試以遞歸方式搜索某些值。如果要搜索的值不存在,它將被添加到數組中,否則不會。

myArr.push(itemToSearch);確實會將項目添加到完全不同的數組中 - 幸運的是您最初傳入的數組,但這仍然是一種不好的做法。相反,如果您只是將其添加到itemArray的預期位置,您甚至可以知道需要插入哪個位置,因此效率會更高,因此之後不需要.sort()

但是,您的遞歸實現會複製(切片)和修改(拼接)數組,這將使其無法簡單地將其添加到當前數組。相反,請保持陣列完好,並使用兩個變量/參數leftIndexrightIndex進行搜索。