2017-10-04 157 views
0

我有以下琴弦组,其中I需要重新安排基于日期,这就需要进行排序最早到最旧重新排列数据

[ 
    "2015-08, xyz, 4", 
    "2016-03, abc, 5", 
    "2015-12, ter, 76", 
    "2015-12, rep, 14" 
] 

最终输出需要的最终输出的阵列的看起来像

[ 
    "2016-03, abc, 5", 
    "2015-12, ter, 76, rep, 14", 
    "2015-08, xyz, 4" 
] 

我该如何去做这件事?

+1

你在这里的问题到底是什么?或者你只是希望有人会为你做所有的辛苦工作? – Liam

+0

@Liam绝对不是,只是寻找一些关于解决问题的指导(伪代码格式) – RRP

+0

只需使用默认的.sort(),然后颠倒数组。只要字符串以年份开始,然后是daya的两个数字,.sort()。reverse()就可以工作。当日期不是以允许按字符串值而不是实际日期排序的格式编写时,它会变得棘手。 (例如,DD/MM/YYYY的欧元格式不能默认为字符串)我会让你自己弄清楚字符串的合并,因为它与排序无关。 – Shilly

回答

2

不是一个完整的解决方案,但它会给你实现你的基础。

您的数据排序:

的想法是,你定义一个包含有关如何比较两个的数组元素,然后调用默认sort功能与参数的逻辑函数(SortByDate在我们的例子)您定义的新功能。

data = [ 
 
    "2015-08, xyz, 4", 
 
    "2016-03, abc, 5", 
 
    "2015-12, ter, 76", 
 
    "2015-12, rep, 14" 
 
]; 
 

 

 

 
//This is the logic 
 
function SortByDate(a, b){ 
 
    dateA = a.split(",")[0];  // e.g. a="2015-08, xyz, 4" dateA="2015-08" 
 
    yearA = dateA.split("-")[0]; // e.g. "2015" 
 
    monthA = dateA.split("-")[1]; // e.g. "08" 
 
    
 
    dateB = b.split(",")[0]; 
 
    yearB = dateB.split("-")[0]; 
 
    monthB = dateB.split("-")[1]; 
 
    
 
    if (parseInt(yearA) < parseInt(yearB)) return -1; 
 
    if (parseInt(yearA) > parseInt(yearB)) return 1; 
 
    if (parseInt(yearA) == parseInt(yearB)) { 
 
    if (parseInt(monthA) < parseInt(monthB)) return -1; 
 
    if (parseInt(monthA) > parseInt(monthB)) return 1; 
 
    if (parseInt(monthA) == parseInt(monthB)) return 0; 
 
    } 
 

 
} 
 

 
data.sort(SortByDate); 
 
console.log(data);

下一步:

  1. 迭代您的数组再次
  2. 如果发现等于日期
  3. 合并这些元素

最后一部分可能会非常棘手,因为您的数组将会丢失一些元素,并且其大小会减小。你可能想看看这个:Looping through array and removing items

+1

感谢@tgogos我使用.sort()。reverse(),但合并和删除元素的链接有助于 – RRP