Javascript Array.prototype.sort()无意中改变了数组

时间:2016-10-31 20:34:07

标签: javascript arrays sorting

我正在尝试对整数数组进行排序,以便将它们按照将形成最大整数的顺序排列。例如,[99,901]应该按[99,901]排序,因为99,901> 90199。并且[91,991]应该被分类为[991,91]因为99,191> 91991

为此,我使用Array.prototype.sort(),将下面代码块中的compare函数作为参数传递。此比较函数的参数是一个数组数组(每个整数首先被拆分为一位数的整数数组):[[9,1],[9,9,1]]。

我的问题是,当这个比较函数工作时,它返回一个截断了一些元素的数组。显然这是因为当需要比较两个整数的第二个(或第三个,第四个等)元素时,我正在调用Array.prototype.shift()。我没有想到这个,但找不到解决办法。

例如,下面的代码输出

[[9],[1,9]]

而我需要的是

[[9,9],[9,1,9]]

你能告诉我如何修改比较功能以获得我想要的输出吗?

谢谢!

var compare = function(a, b){

    if(a.length === 1 || b.length === 1){
        return (b[0] - a[0]);
    }

    else if(a[0] !== b[0]){
        return compare(a[0], b[0]);
    }

    else if(a[0] === b[0]){
        if(a.length !== 1){
            a.shift();
        }
        if(b.length !== 1){
            b.shift();
        }
        return compare(a, b);
    }
};

var example = function(){

    var digits = [[9,9],[9,1,9]];
    digits.sort(compare);
    console.log(digits);
};

example();

2 个答案:

答案 0 :(得分:0)

最简单(但效率低下)的方法是复制数组:

var compare = function(a, b){
a = a.slice();
b = b.slice();

答案 1 :(得分:0)

虽然您已经接受了答案,但我仍然想回答您的问题... "我如何修改比较功能?" ,因为您确实需要to:它目前为某些输入提供了错误的结果,例如:



var compare = function(a, b){

    if(a.length === 1 || b.length === 1){
        return (b[0] - a[0]);
    }

    else if(a[0] !== b[0]){
        return compare(a[0], b[0]);
    }

    else if(a[0] === b[0]){
        if(a.length !== 1){
            a.shift();
        }
        if(b.length !== 1){
            b.shift();
        }
        return compare(a, b);
    }
};

console.log('this should return a number greater than 0:');
console.log(compare([8,1],[8,1,9,2]));




以下是如何纠正它,并且没有变异也是如此:



var compare = function(a, b){
    for (var i = 0; i < a.length || i < b.length; i++) {
        var diff = b[i % b.length] - a[i % a.length];
        if (diff) return diff;
    }
    return 0;
};

console.log('this should return a number greater than 0:');
console.log(compare([8,1],[8,1,9,2]));
var digits = [[8,1],[8,1,9,2]];
digits.sort(compare);
console.log('sorted:');
console.log(JSON.stringify(digits));
&#13;
&#13;
&#13;