Javascript 解析自定义日期和排序

Javascript 解析自定义日期和排序,javascript,jquery,parsing,sorting,date,Javascript,Jquery,Parsing,Sorting,Date,我是javascript/jQuery新手,正在尝试一些对我的技能水平有雄心壮志的事情。我发现了一些有帮助的片段,但我被卡住了 我有一系列的日期,格式如下:dd月yyyy(2013年10月10日)。据我所知,这是一种非传统的约会方式。因此,我要做的是将日期解析为正常格式,然后使用jQuery tinysort插件(我认为我没有正确使用该插件)排列父div 我在这里做了一个jsfiddle: 或者这是我的代码: <div id="date-sort"> <div class=

我是javascript/jQuery新手,正在尝试一些对我的技能水平有雄心壮志的事情。我发现了一些有帮助的片段,但我被卡住了

我有一系列的日期,格式如下:dd月yyyy(2013年10月10日)。据我所知,这是一种非传统的约会方式。因此,我要做的是将日期解析为正常格式,然后使用jQuery tinysort插件(我认为我没有正确使用该插件)排列父div

我在这里做了一个jsfiddle:

或者这是我的代码:

<div id="date-sort">
  <div class="date-content"> 
    <p>Some Content</p>
    <p class="date-sort">10-Oct-2013</p>
    <hr />
  </div>
  <div class="date-content"> 
    <p>Some Content</p>
    <p class="date-sort">12-Oct-2013</p>
    <hr />
  </div>
  <div class="date-content"> 
    <p>Some Content</p>
    <p class="date-sort">2-Sep-2013</p>
    <hr />
  </div>
  <div class="date-content"> 
    <p>Some Content</p>
    <p class="date-sort">22-Jun-2013</p>
    <hr />
  </div>
  <div class="date-content"> 
    <p>Some Content</p>
    <p class="date-sort">1-May-2013</p>
    <hr />
  </div>
</div>

一些内容

2013年10月10日


一些内容

2013年10月12日


一些内容

2013年9月2日


一些内容

2013年6月22日


一些内容

2013年5月1日


$(文档).ready(函数(){
函数customParse(str){
变量月数=['一月','二月','三月','四月','五月','六月',
“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”],
n=months.length,re=/(\d{2})-([a-z]{3})-(\d{4})/i,匹配项;
而(n--){months[months[n]]=n;}//将月份名称映射到它们的索引:)
matches=str.match(re);//从字符串中提取日期部分
返回新日期(匹配项[3]、月份[匹配项[2]、匹配项[1]);
}
var数组=[];
变量元素=$('.date sort');
对于(var i=0;i.date content>.date sort').tsort();
});

感谢您的帮助、见解或输入。

在JavaScript中,对象通常被认为是创建关联映射的最佳方式(正如下面的评论员所指出的,在数组上设置属性是完全有效的)

我会使用一个对象作为月名和数字之间的映射。此外,我会使用小写名称,因此我可以支付一次小写的费用,并在映射中使用该值

因此,我将用对象初始值设定项替换
months
数组的定义:

var months = { 'jan': 1, 'feb': 2, 'mar': 3, /*...*/ };
这样,就不需要循环了


现在,您只需对输入调用
.toLowercase()
,月份名称就会正确映射。

您需要为tinysort提供一个可排序的日期

new Date(matches[3], months[matches[2]], matches[1]).toJSON();

// ...

current.setAttribute('data-date', customParse(current.textContent));

// ...

$('div#date-sort>.date-content').tsort('.date-sort', {attr: 'data-date' });
您的正则表达式限制太多,因为天并不总是两个数字

re = /(\d{1,2})-([a-z]{3})-(\d{4})/i

您只需使用
.replace()
消除
-
标记,然后使用
new Date().getTime()
将1970年1月1日午夜到日期之间的毫秒数指定给一个数组,该数组将按照您的需要进行排序

$(document).ready(function(){
  var ds = $('.date-sort'), dt = [];
  ds.each(function(i){
    dt[i] = new Date($(this).html().replace(/-/g, ' ')).getTime();
  });
  dt.sort();
  ds.each(function(i){
    $(this).html(new Date(dt[i])/*add . whatever here*/);
  });    
});

我更新了您的。

您需要将您的问题修改为更具体的内容,而不是询问见解等。除了可以在Kavun下面的答案中找到的已修复错误外,您还将遇到textContent属性的问题:IE几乎不支持它。在customParse之后添加valueOf()调用。我在我的第一个版本中犯了同样的错误;)他没有在数组上设置字符串索引。他使用括号表示法访问数组上的命名属性(这只是一天结束时的一个对象)<代码>var arr=[1];arr['test']=2;控制台日志(arr)将输出数组,但也将输出添加的属性
test
。我不同意。这句话,尽管可能很难看,但却是完全有效和有效的。它所做的是设定一月,二月。。。将月数组的属性添加到其索引中。如:月份。一月=0,月份。二月=1。。。['Jan']符号用于创建这些属性。是的,Kavun,你说得对。我会相应地更新我的答案。我不喜欢以这种方式使用数组,但你们的断言是正确的。先生们,我的观点是正确的。我运行了代码并打印出了
months
的值,并且简单地忘记了JavaScript中数组的真实性质(它们是具有属性的对象,但属性不可枚举,这就是它们无法打印的原因)。
$(document).ready(function(){
  var ds = $('.date-sort'), dt = [];
  ds.each(function(i){
    dt[i] = new Date($(this).html().replace(/-/g, ' ')).getTime();
  });
  dt.sort();
  ds.each(function(i){
    $(this).html(new Date(dt[i])/*add . whatever here*/);
  });    
});