javascript switch语句跳回状态

时间:2014-03-04 13:04:20

标签: javascript recursion switch-statement

我有简单的数组[3,7,9],我尝试递归搜索某些值。如果要搜索的值不存在,则将其添加到数组中,否则不会。我正在使用开关盒结构,但面临严重的问题。

首先搜索价值2.在返回函数之前一切正常。由于某种原因,代码跳回到休息状态; -line in“case a:”然后将itemFound设置为'undefined'。为什么会发生这种跳跃?

搜索值5跳回到休息状态;在“案例b:”中,itemFound再次获得值“未定义”。

使用其他值时,会有更多跳跃。

我确实希望代码只做一个switch-case并退出条件。

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;
}

1 个答案:

答案 0 :(得分:0)

  

由于某种原因,代码跳回到休息状态; -line in&#34; case a:&#34;然后将itemFound设置为&#39; undefined&#39;。为什么会发生这种跳跃?

因为return在调用堆栈上跳回一级。您没有在函数内部跳转,而是从递归调用跳转到调用它 - 以及itemFound仍然未定义。

  

我尝试递归搜索某些值。如果要搜索的值不存在,则将其添加到数组中,否则不会。

myArr.push(itemToSearch);确实将项目添加到一个完全不同的数组中 - 幸运的是你最初传入的数组,但它仍然是一个不好的做法。相反,如果你只是在itemArray的预期位置添加它会更有效 - 你甚至已经知道它需要插入什么位置,所以之后不需要.sort()。 / p>

但是,您的递归实现会复制(切片)和修改(拼接)数组,这使得无法将其简单地添加到当前数组中。相反,保持数组完整,并使用两个变量/参数leftIndexrightIndex进行搜索。