javascript - 数组中最后一项的行为异常

标签 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

有人可以帮助我吗,因为我快疯了,无法弄清楚为什么它会这样!

最佳答案

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

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

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

关于javascript - 数组中最后一项的行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48087537/

相关文章:

javascript - 使用 jquery .each 循环从数组中的值创建多维 javascript 对象

c++ - 里面注入(inject)的DLL在哪里循环?

python - 我怎样才能做到这一点,但骰子的数量是可变的?

iphone - objective-c : for-loop gets slower and slower

javascript - 用鼠标在 Canvas 中移动图像

javascript - Visual Studio 2015 package.appxmanifest 中起始页中的 ms-appx-web 存在错误?

javascript - Ajax/PHP/JavaScript 表单提交并带有本地存储值

javascript - 自定义产品照片

arrays - 如何在 NodeJS 中读取缓冲区的前 n 个字节并将其转换为字符串?

javascript - 在 JavaScript 中获取 2 个对象数组之间的差异