对在Javascript

时间:2017-03-11 05:24:23

标签: javascript sorting

我正在尝试对以下列表列表进行排序:

var entries = [[new Date("Thu Apr 06 2017"), 12], [new Date("Thu Feb 02 2017"), 11]]
entries.sort()

我希望条目会切换顺序,因为第一个日期是在第二个日期之后。但是,这种情况并没有发生。这是为什么?

4 个答案:

答案 0 :(得分:4)

您需要为sort()提供一个参数,以便它知道如何比较内部数组。默认情况下,它只会将它们转换为字符串并进行比较

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

  

如果未提供compareFunction,则通过将元素转换为字符串并按Unicode代码点顺序比较字符串来对元素进行排序。例如,“香蕉”出现在“樱桃”之前。在数字排序中,9出现在80之前,但由于数字被转换为字符串,因此“80”以Unicode顺序出现在“9”之前。

因此,在您的情况下,将"[new Date("Thu Apr 06 2017"), 12]""[new Date("Thu Feb 02 2017"), 11]"进行比较{4}中A在{2}之前的F

工作代码:

var entries = [[new Date("Thu Apr 06 2017"), 12], [new Date("Thu Feb 02 2017"), 13]]
entries.sort(function(a, b) {
   // compare the dates
   return a[0]-b[0];
});

答案 1 :(得分:0)

sort()方法对数组的项进行排序。

排序顺序可以是字母顺序或数字顺序,也可以是升序(向上)或降序(向下)。

默认情况下,sort()方法按字母顺序和升序将值排序为字符串。

你可以这样排序

var entries = [
    {calander: "Thu Apr 06 2017",value:"12"}, 
    {calander: "Thu Feb 02 2017",value:"11"}
];

entries.sort((x)=> new Date(x.calander).getTime());

enter image description here

答案 2 :(得分:0)

由于您的数组包含数组中的数组。[new Date(“Thu Apr 06 2017”),12]在主数组中是包含日期和12个数字输入的子数组。 因此,对整个数组进行排序需要编写自己的自定义排序函数。 它就像你的日期对象包含

一样简单
  [new Date("Thu Apr 06 2017"), 12]
  [0]->new Date("Thu Apr 06 2017")
  [1]->12 

因此,根据需要编写排序函数的日期对数组进行排序,如下所示。

entries.sort(
          function(x, y)
          {
             return x[0] > y[0];
          }
        );

它会根据日期对数组进行排序。

答案 3 :(得分:0)

要在javascript中对数组进行排序,您使用的是Array.prototype.sort()方法。

当不带参数调用此方法时,arr.sort()然后

  

根据每个元素的字符串转换,根据每个字符的Unicode代码点值对数组进行排序。

这对您的情况不起作用,因为您的数组中有数组。

因此,您希望使用arr.sort(compareFunction)形式,您需要提供一个compareFunction(a, b)来比较数组的两个元素。比较函数需要返回一个数字。如果小于零,则a首先出现,如果为零则为零,如果高于零,则b为先。

因此,为了解决您的问题,我们只需要创建比较数组内部数组的compareFunction。

var entries = [[new Date("Thu Apr 06 2017"), 12], [new Date("Thu Feb 02 2017"), 11]]

function compareMyArrays(a, b){
  var aTime = a[0].getTime();
  var bTime = b[0].getTime();
  return aTime - bTime;
}

entries.sort(compareMyArrays);