JavaScript:将包含日期的数组按降序排序

4
我将翻译以下数组:

我有以下数组:

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

我希望能将这些日期及其对应的权重按升序排列。
我知道你可以使用sort函数来排序数组,我在About.com页面上找到了下面的函数,我认为它可以实现我的要求:
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

有人能帮我解决我的问题吗?

提前致谢。

编辑:

看了之前的一个stackoverflow问题,似乎在我的情况下,'a'不是一个字符串。然而,我不明白为什么会这样。


因为在你的示例中,times 数组存储了 3 个数组,而不是字符串(例如 ["04/11/10", "86kg"])。所以在排序函数中,ab 将会是两个数组。 - kapa
2个回答

3

在对数组进行排序时,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 错误是因为 replace() 是属于 String 方法,你试图将其应用于一个 Array 对象上。


非常感谢Gion,它完美地运行了。老实说,排序函数让我完全困惑了。我将'a'和'b'作为参数传递给'dmyOrdA'函数,但我看不出这与我的'times'数组有什么关系。如果您有时间的话,能否解释一下这个问题呢?谢谢。 - Stephen Young
@Stephen Young:当你在JavaScript中对数组进行排序时,需要提供两个数组元素之间的比较方式。这样,你就可以将一个函数作为参数传递给sort方法,该函数接收两个数组元素,并决定哪个元素将是“更小的”和哪个元素将是“更大的”。如果第一个元素“更大”,则该函数将返回1。如果它比另一个元素“更小”,它将返回-1,如果它们相等,则返回0。你可以将函数想象成一个问题:第一个元素是否比第二个元素大?答案:1-是,-1-否,0-不确定。 - gion_13
@gion_13 我想我开始理解了。只有两个问题:(1) 你说“将一个函数作为参数传递给sort方法,该函数接受数组的2个元素”,但是sort方法如何知道如何对数组中的所有元素进行排序呢?(2) 我不理解函数的return方面。如果删除else if部分并将if(a>b)return 1更改为if(a>b)return -1,它仍将按升序排序。但是,如果省略(a>b)语句,只有if(a<b)return -1,它将不会按降序排序,但return 1将会。为什么? - Stephen Young
(1)这取决于浏览器的实现,但我认为sort方法递归地将给定函数应用于元素对。为了排序一个列表,在某一点上,你必须比较两个元素;你的函数告诉比较逻辑。有关排序算法,请参见http://en.wikipedia.org/wiki/Sorting_algorithm。(2)如果你改变了一个if,也要改另一个if ;) 你必须为每种比较情况返回一个返回值,以便算法知道如何修改列表。如果你尝试像[4,3,2,1].sort(function(a,b){return -1;})这样的东西,你不会得到一个排序好的列表。 - gion_13
@Stephen Young:它确实可行,只要您放入正确的参数。您应该将a [1]b [1]进行比较,因为ab是您要排序的数组元素,它们本身也是数组。如果要按第二个元素对它们进行排序,您必须访问它们的第二个元素(又名:el [1])。 如果使用a [0] [0],则该值将未定义,因为a是单维数组。 - gion_13
显示剩余3条评论

0
你应该先将日期转换为正确的格式,然后在比较函数中进行减法运算。
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]);}

谢谢。我一直在想怎么做。为什么在a[1]后面加上了-1 - Stephen Young
月份参数是基于0的;日期是基于1的。 - ic3b3rg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接