首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按月和年排序数组

按月和年排序数组
EN

Stack Overflow用户
提问于 2019-03-08 10:32:43
回答 9查看 4.5K关注 0票数 21

我需要帮助排序的数组按月和年分别显示在图表上。

代码语言:javascript
复制
Array1: ['Mar19','Apr18','Jun18','Jul18','May18','Jan19'....];
Desired Output : [....'Apr18','May18','Jun18','Jul18','Jan19','Mar19'];

我也有另一个数组,每个月的值分别根据上面的数组。

代码语言:javascript
复制
Array2: ['Mar19_value','Apr18_value','Jun18_value','Jul18_value','May18_value'
       ,'Jan19_value'....];

Array2: ['55','2','3','0','21','132'....]; //real values

monthyear数组排序时,我希望这个数组中的数据根据monthyear位置移动到一个新的位置。如下所示:

代码语言:javascript
复制
Desired Array1: [....'Apr18','May18','Jun18','Jul18','Jan19','Mar19'];
Desired Array2: [....'Apr18_value','May18_value','Jun18_value','Jul18_value','Jan19_value','Mar19_value'];

所以以后我可以选择这样的数据:

代码语言:javascript
复制
var label = array[4];
var value = array2[4];

如何才能做到这一点?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2019-03-08 10:50:36

您可以将日期作为可排序字符串获取并对其进行排序。

要获得由一个签名数组排序的多个数组,可以使用map进行排序,在映射中对索引数组进行排序,指示最终的排序,然后使用此排序重新分配所有数组。

getD函数通过获取用于排序的array0索引来返回格式化的字符串。在函数的内部,字符串被分解为月份和年份部分,并被它的ISO 8601表示所取代。替换函数回调接受匹配的项,返回一个具有格式化年份的数组和一个具有月份名称和相关月份号的对象月份。然后,将这个数组连接起来并返回。

排序是通过与String#localeCompare进行比较进行的。

代码语言:javascript
复制
var array1 = ['Mar19', 'Apr18', 'Jun18', 'Jul18', 'May18', 'Jan19'],
    array2 = ['Mar19_value', 'Apr18_value', 'Jun18_value', 'Jul18_value', 'May18_value', 'Jan19_value'],
    array3 = ['55', '2', '3', '0', '21', '132'],
    indices = Object
        .keys(array1)
        .sort(function (a, b) {
            function getD(i) {
                var months = { Jan: '01', Feb: '02', Mar: '03', Apr: '04', May: '05', Jun: '06', Jul: '07', Aug: '08', Sep: '09', Oct: '10', Nov: '11', Dec: '12' },
                    s = array1[i];
                return s.replace(/^(...)(.+)$/, (_, m, y) => [y.padStart(4, '0'), months[m]].join('-'));
            }
            return getD(a).localeCompare(getD(b));
        }),
    result = [array1, array3].map(a => indices.map(i => a[i]));
  
result.forEach(a => console.log(...a));

票数 12
EN

Stack Overflow用户

发布于 2019-03-08 10:41:58

需要将字符串更改为 format,如下所示

代码语言:javascript
复制
new Date(Month Date Year)

两个阵列的更新正则表达式

https://regex101.com/r/h1cm1z/2/

基于第一数组排序索引的更新的排序第二数组

代码语言:javascript
复制
var arr1 =  ['Mar19','Apr18','Jun18','Jul18','May18','Jan19'];
var arr2 =['55','2','3','0','21','132'];

function datesort(arr){
 return arr.concat().sort((a,b)=>{
 a = a.replace(/(\d+)(.*)/g,' 1 $1'); // Month 1 YEAR
 b = b.replace(/(\d+)(.*)/g,' 1 $1'); // Month 1 YEAR
  return new Date(a) - new Date(b)
})
}

var after_arr1 =new datesort(arr1);
var after_arr2 = arr1.reduce(function(a,b,c){
     var ind = after_arr1.indexOf(b);
     a[ind] = arr2[c]
     return a
},[]);


console.log(after_arr1.join(','));
console.log(after_arr2.join(','))

票数 14
EN

Stack Overflow用户

发布于 2019-03-08 10:42:36

代码语言:javascript
复制
const input = ['Mar19', 'Apr18', 'Jun18', 'Jul18', 'May18', 'Jan19'];

//const output : ['Apr18','May18','Jun18','Jul18','Jan19','Mar19'];
//Can be done easily by using momentjs, darte-fns, but here i will do it natively

const t = {
  Jan: 1,
  Feb: 2,
  Mar: 3,
  Apr: 4,
  May: 5,
  Jun: 6,
  Jul: 7,
  Aug: 8,
  Sep: 9,
  Oct: 10,
  Nov: 11,
  Dec: 12
}
const giveConcatString = (a, t) => {
  const monthPart = a.substr(0, 3)
  const yearPart = a.substr(3)
  return `${yearPart}${t[monthPart]}`
}
const sortedArray = input.sort((a, b) => {
  const concatString = giveConcatString(a, t)
  const concatStringB = giveConcatString(b, t)
  return concatString <= concatStringB ? -1 : 1

})
console.log(sortedArray)

这可能会帮助你解决这个问题。本地人做的。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55061324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档