Chrome的Array.sort的compareFunction将不执行任何操作

时间:2018-01-30 12:58:24

标签: javascript arrays google-chrome

我需要一个compareFunction,它将在下面使用,数组根本不会改变。
我提供的代码非常适合Mozilla,但不适用于Chrome。
在Chrome上运行代码段,您会看到array2(超过10个对象)的订单已更改。
如何为Chrome实现保留订单?
我不需要任何排序,因为我已经知道我的数组将被排序。



function compareFunction(direction, a, b){
  return 0;
}

var array1 = [1,2,3,4,5,6,7,8,'x',10];
array1.sort((a,b)=>{return compareFunction.call(null, 'asc', a, b)});
console.log(array1.toString());

var array2 = [1,2,3,4,5,6,7,8,'x',10,11];
array2.sort((a,b)=>{return compareFunction.call(null, 'asc', a, b)});
console.log(array2.toString());




2 个答案:

答案 0 :(得分:0)

比较器功能中选择ab的顺序依赖于实现。在chrome中,如果项目的长度超过10,它会快速排序,这就是为什么它在6之前选择2进行比较。

而不是this,传递实际数组并比较原始数组中参数的索引位置。

您需要通过执行array.slice() 复制原始数组,以便在排序时不会发生变异。

function compareFunction(a,b){
  return this.indexOf(a) - this.indexOf(b);
}

var array1 = [1,2,3,4,5,6,7,8,'x',10];
array1 = array1.slice().sort(function(a,b){return compareFunction.call(array1,a,b)});
console.log(array1);

var array2 = [1,2,3,4,5,6,7,8,'x',10,11];
array2 = array2.slice().sort(function(a,b){return compareFunction.call(array2,a,b)}); 
console.log(array2);

答案 1 :(得分:0)

像这样的东西

var arr1 = [1,2],
    arr2 = [1,2,3],
    arr3 = [1,2,3],
    arr4 = [3,2,1];

function compare(a, b) {

  if(a.length != b.length) return false;

  for(var i = 0; i < a.length; i++) {
    if(a[i] != b[i]) return false;
  }

  return true;

}


console.log(compare(arr1, arr2)); // false
console.log(compare(arr2, arr3)); // true
console.log(compare(arr3, arr4)); // false