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

问题描述 投票:0回答:1

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

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 arrays loops
1个回答
4
投票

在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

© www.soinside.com 2019 - 2024. All rights reserved.