获取数组中的最后一项表现很奇怪

时间:2018-01-04 01:35:44

标签: javascript arrays loops

我有这个函数应该对数组进行排序,然后得到最后一项的差异 - 第一项并在中间添加所有缺失的数字,然后将它与原始数组进行比较并计算出有多少数字添加了,所以它工作正常,但在一些测试用例中,它表现奇怪,在数组索引的最后一项不是正确的下面是代码和测试用例

function makeArrayConsecutive2(statues) {
    var sorted = statues.sort();
    var arr =[];
    var firstItem = sorted[0];
    var lastItem = sorted[sorted.length -1];
    var difference= lastItem-firstItem;
    var counter=0;

    for (var i=0;i<=difference;i++){
        arr.push(firstItem++);
    }

    for(var i=0;i<arr.length;i++){
        if(sorted.indexOf(arr[i])==-1){
            counter++;
        }
    }

    console.log(counter);
}

makeArrayConsecutive2([1,3,5]); //this works correctly and the output 
//is 2 since the numbers missing are 2 and 4 so 2 numbers

makeArrayConsecutive2([1,3,5,9,12]); //this outputs 5 when it should 
//output 7

有人可以帮助我,因为我疯了不能弄清楚为什么它的表现如此!

1 个答案:

答案 0 :(得分:4)

在JavaScript中,内置Array.sort()基于字符串排序,而不是数字。因此,即使您有一个数字数组,也需要将比较函数传递给sort()方法,以确保将值排序为数字:

&#13;
&#13;
function makeArrayConsecutive2(statues) {
    var sorted = statues.sort(function (a,b) {
      return a - b;
    });
    var arr =[];
    var firstItem = sorted[0];
    var lastItem = sorted[sorted.length -1];
    var difference= lastItem-firstItem;
    var counter=0;

    for (var i=0;i<=difference;i++){
        arr.push(firstItem++);
    }

    for(var i=0;i<arr.length;i++){
        if(sorted.indexOf(arr[i])==-1){
            counter++;
        }
    }

    console.log(counter);
}

makeArrayConsecutive2([1,3,5]); //this works correctly and the output 
//is 2 since the numbers missing are 2 and 4 so 2 numbers

makeArrayConsecutive2([1,3,5,9,12]); //this outputs 5 when it should 
//output 7
&#13;
&#13;
&#13;

您的第一个示例有效,因为只有三个数字,即使被视为字符串,它们也会按正确的顺序排序。另一方面,当您按字符串排序时,您的第二个数组变为[1, 12, 3, 5, 9] - 您可以自己记录以查看。通过使用自定义比较功能,可以正确排序数字。有关详细信息,请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort