【问题标题】:Javascript: sorting arrays that contain dates into descending orderJavascript:将包含日期的数组按降序排序
【发布时间】:2011-05-30 16:30:39
【问题描述】:

我有以下数组:

var times = [
            ["04/11/10", "86kg"], 
            ["05/12/11", "90kg"],
            ["06/12/11", "89kg"]
];

我想按升序列出这些日期及其相应的权重。

我知道您可以使用 sort 对数组进行排序,并且我从 this About.com page 中找到了以下函数,我认为它可以满足我的需求:

times.sort(dmyOrdA);
var dateRE = /^(\d{2})[\/\-](\d{2})[\/\-](\d{2})/;
function dmyOrdA(a,b) {
    a = a.replace(dateRE, "$3$2$1");
    b = b.replace(dateRE, "$3$2$1");

    if (a > b) {
        return 1;
    }

    else if (a < b) {
        return -1;
    }

    else {
        return 0;
    }
}

但是,使用这个函数给了我以下错误:

a.replace is not a function

有人可以帮忙解答我的问题吗?

提前致谢。

编辑:

查看以前的stack overflow question 似乎在我的情况下'a' 不是字符串。但是,我不明白为什么会这样。

【问题讨论】:

  • 因为您的 times 数组在您的示例中存储了 3 个数组,而不是字符串(例如 ["04/11/10", "86kg"])。所以使用排序函数,ab 将是两个数组。

标签: javascript arrays sorting


【解决方案1】:

对数组进行排序时,sort函数所取的参数是数组元素。
在您的情况下,您的数组元素也是数组...真可惜。
您想按每个元素的第一个元素对数组数组进行排序(棘手)。
所以只需将 ab 更改为 a[0]b[0]

function dmyOrdA(a,b) {
    a = a[0].replace(dateRE, "$3$2$1");
    b = b[0].replace(dateRE, "$3$2$1");
    if (a > b)
        return 1;
    else if (a < b)
        return -1;
    else
        return 0;
}

你得到了a.replace is not a function,因为替换是一个String 方法,你试图将它应用到Array

【讨论】:

  • 非常感谢 Gion 完美运行。老实说,排序功能完全让我感到困惑。我将 'a' 和 'b' 作为参数传递给 'dmyOrdA' 函数,但我看不出这与我的 'times' 数组有什么关系。如果你有时间,如果你能解释一下,那就太好了。谢谢。
  • @Stephen Young:在 javascript 中对数组进行排序时,需要提供一种比较数组中两个元素的方法。这样,您将作为参数传递给 sort 方法的函数,该函数采用数组的 2 个元素并决定哪个是lower,哪个是greater。如果第一个元素是grater,而不是另一个,函数将返回1。如果低于另一个,则返回-1,如果相等,则返回0。你可以把函数想象成一个问题:第一个元素比第二个大吗?答案:1-yes,-1-no,0-inconclusive
  • @gion_13 我想我开始明白这一点了。只有两个问题:(1)您说“您将一个函数作为参数传递给 sort 方法,该函数采用数组的 2 个元素”但是 sort 方法如何知道如何对 all 中的元素进行排序阵列? (2) 我不明白函数的return 方面。如果您取出else if 部分并将if (a &gt; b) return 1 更改为if (a &gt; b) return -1,它仍将按升序排序。但是,如果您省略 (a &gt; b) 语句而只使用 if (a &lt; b) return -1 它不会按降序排序,但 return 1 会。为什么?
  • (1)这取决于浏览器的实现,但我认为 sort 方法将给定的函数递归地应用于元素对。为了对列表进行排序,您必须在某个点上-比较两个元素;并且您的函数会告诉比较逻辑。对于排序算法,请参阅en.wikipedia.org/wiki/Sorting_algorithm.(2)If 如果您更改一个,也更改另一个;)您必须始终为每个比较情况提供一个返回值,以便算法知道如何更改列表。如果你尝试像[4,3,2,1].sort(function(a,b){return -1;}) 这样的东西,你不会得到一个排序列表。
  • 我快到了!! Mozilla 文档 (developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…) 说“如果 compareFunction(a, b) 大于 0,则将 b 排序为低于 a 的索引。”在这种情况下,如果您执行if (a &gt; b) return -1,那么肯定a 应该被排序到比b 更低的索引?但如果你这样做,什么都不会排序。
【解决方案2】:

您应该转换为正确的日期,然后在比较函数中减去:

function dmyOrdA(a,b){return myDate(a[0]) - myDate(b[0]);}
function myDate(s){var a=s.split("/"); return new Date("20"+a[2],a[1]-1,a[0]);}

【讨论】:

  • 谢谢。我想知道该怎么做。为什么你把-1放在a[1]之后?
  • 月份参数从0开始;这一天是基于 1 的
猜你喜欢
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
相关资源
最近更新 更多