【问题标题】:Passed into the function array is undefined传入函数数组是未定义的
【发布时间】:2016-09-16 11:15:54
【问题描述】:

我想增强合并排序算法,以便它对两个数组进行排序并删除重复项。 我想出了以下代码:

function mergeSortEnhanced(arr, arr2)
{
    while(arr2.length)
     {
        arr.push(arr2.shift());
     }
    if (arr.length < 2)
        return arr;

    var middle = parseInt(arr.length / 2);
    var left   = arr.slice(0, middle);
    var right  = arr.slice(middle, arr.length);

    return merge(mergeSortEnhanced(left), mergeSortEnhanced(right));
}

function merge(left, right)
{
    var result = [];

    while (left.length && right.length) {
        if (left[0] < right[0])
        {
            result.push(left.shift());
        } 
        else if(left[0] > right[0])
        {
            result.push(right.shift());
        }
        else
        {
            result.push(left.shift());
            right.shift()
        }
    }

    while (left.length)
        result.push(left.shift());

    while (right.length)
        result.push(right.shift());

    return result;
}
var a = [1, 2 , 2 , 1];
var b = [1, 1, 6 ,8];
console.log(mergeSortEnhanced(a, b).join());

问题是我在第四行遇到错误

while(arr2.length)

这表明编译器无法计算未定义的长度。我不明白为什么函数内部未定义第二个数组以及如何修复它

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    问题出在

    return merge(mergeSortEnhanced(left), mergeSortEnhanced(right));
    

    您在这里只传递函数中的第一个参数,因此第二个未定义。 也许你想做

        return merge(left, right);
    

    顺便说一句,只是作为一个建议 - 递归要非常小心

    【讨论】:

    • 哦,哇,我怎么会这么瞎。我通过检查 arr2 != undefined 来解决这个错误。现在可以了,谢谢
    【解决方案2】:

    在while之前添加检查。将您的代码更新为

    if (arr2){
        while(arr2.length)
         {
            arr.push(arr2.shift());
         }
    }
    

    shift() 方法删除数组的第一项,并返回该项。因此,经过 4 次迭代后,您的 arr2 变得未定义。

    【讨论】:

      猜你喜欢
      • 2013-11-12
      • 1970-01-01
      • 2017-08-27
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 2020-02-27
      • 1970-01-01
      相关资源
      最近更新 更多