2017-09-24 41 views
0

我遇到了这种麻烦。我有一个包含这样的值的数组:如何正确排序这些类型的数组?

array = [ {SortTime : 123456, Operation : Assigning}, {SortTime : 4567 , Operation: Assigning}, {SortTime : 123456 , Operation: Assigned} ]; 

所以,如果我比较数组[0]和数组[2]我想保持顺序,使我以前的“已分配”

“分配”

这些数字的每个人都是一个纪元数,所以我需要,如果算法与两个相等的数字一起工作,它会为这两个数字保留相同的初始顺序(如果我有数组[4] = 12345和数组[5] = 12345,我希望数组[4]和数组[5]不按顺序变成数组[5]和数组[4])。

array.sort(function(a, b) { 
     if (a.val.SortTime === b.val.SortTime) { 
      return -1; 
     } else { 
      return a.val.SortTime - b.val.SortTime; 
     } 
    }); 

由于经常在等号之间交换位置,所以这样做并不奏效。 如果我的解释不好,我很抱歉。 提前谢谢!

+0

工作实例需要在这种情况下 – bigbounty

+0

使用的BigInteger _“(如果我有数组[4] = 12345和阵列[5 ] = 12345,我希望数组[4]和数组[5]不按顺序变成数组[5]和数组[4])“_你怎么知道它们的区别?或者,Question中的'array'变量不是实际数组的精确表示? – guest271314

+0

您的示例数据不正确,使问题变得毫无意义。 – glennsl

回答

0

您可以添加到对象的索引属性和按时间排序,然后通过索引,以保持关系同一时间项目。

由于采取了索引,结果是稳定的结果。

var array = [ 
 
     { SortTime: 123456, Operation: 'Assigning', index: 0 }, 
 
     { SortTime: 4567, Operation: 'Assigning', index: 1 }, 
 
     { SortTime: 123456, Operation: 'Assigned', index: 2 } 
 
    ]; 
 

 
array.sort(function (a, b) { 
 
    return a.SortTime - b.SortTime || a.index - b.index; 
 
}); 
 

 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

这工作!谢谢 – Vins

0

Array.sort的规范确实是而不是保证如果从函数返回0,则将保留两个元素的顺序。这将取决于实施是否保留其订单。许多实现保留它,有些则不。

在你的情况,与整数,我不明白这怎么重要。但是,如果你有对象的情况下,你真的需要保持被认为是“相同”的东西的顺序,那么你可能需要编写自己的排序。特别是,你会想要实现一个“稳定的”排序算法。

0

你想要的是一个稳定的排序。参见维基百科的stable sort algorithms

下面的列表是一个merge sort implementation from Rosetta Code

function merge(left, right, arr) { 
 
    var a = 0; 
 
    
 
    while (left.length && right.length) { 
 
    arr[a++] = (right[0] < left[0]) ? right.shift() : left.shift(); 
 
    } 
 
    while (left.length) { 
 
    arr[a++] = left.shift(); 
 
    } 
 
    while (right.length) { 
 
    arr[a++] = right.shift(); 
 
    } 
 
} 
 
    
 
function mergeSort(arr) { 
 
    var len = arr.length; 
 
    
 
    if (len === 1) { return; } 
 
    
 
    var mid = Math.floor(len/2), 
 
     left = arr.slice(0, mid), 
 
     right = arr.slice(mid); 
 
    
 
    mergeSort(left); 
 
    mergeSort(right); 
 
    merge(left, right, arr); 
 
} 
 
    
 
var arr = [1, 5, 2, 7, 3, 9, 4, 6, 8]; 
 
console.log(arr); 
 
mergeSort(arr) 
 
console.log(arr);

0

有一个在JSBin

var arr = [ 
    { 
     SortTime: 123456, 
     Operation: 'first operator' 
    }, { 
     SortTime: 4567, 
     Operation: Assigning 
    }, { 
     SortTime: 123456, 
     Operation: 'second operator' 
    }]; 

var copy = [...arr]; 

copy.sort(function(a, b) { 
    if (a.val.SortTime === b.val.SortTime) { 
     return arr.indexOf(a) - arr.indexOf(b); 
    } else { 
     return a.val.SortTime - b.val.SortTime; 
    } 
}); 
相关问题