简体   繁体   English

如何使用JavaScript根据日期键对对象数组进行排序?

[英]How to sort array of object based on key that is date using javascript?

I have an array as follow (date in mm-dd-yyyy format) in javascript. 我在JavaScript中有以下数组(日期以mm-dd-yyyy格式)。

[ 
  {'12-11-2018': 'NA' },
  { '12-05-2018': 'NA' },
  { '12-09-2018': 'pass' },
  { '12-07-2018': 'pass' },
  { '12-10-2018': 'pass' },
  { '12-08-2018': 'pass' },
  { '12-06-2018': 'pass' } 
]

I want to sort it using the date in ascending order. 我想按日期升序对它进行排序。

Expected output 预期产量

[ 
  { '12-05-2018': 'NA' },
  { '12-06-2018': 'pass' },
  { '12-07-2018': 'pass' },
  { '12-08-2018': 'pass' },
  { '12-09-2018': 'pass' },
  { '12-10-2018': 'pass' },
  { '12-11-2018': 'NA' } 
]

You can get the first key of each object, convert it to a date, then run a sort by comparing these dates: 您可以获取每个对象的第一个键,将其转换为日期,然后通过比较以下日期进行排序:

 const data = [{ '12-11-2018': 'NA' }, { '12-05-2018': 'NA' }, { '12-09-2018': 'pass' }, { '12-07-2018': 'pass' }, { '12-10-2018': 'pass' }, { '12-08-2018': 'pass' }, { '12-06-2018': 'pass' } ] const getDate = str => { const parts = str.split('-') return new Date(parts[0], parts[1] - 1, parts[2]) } const getFirstKey = obj => Object.keys(obj)[0] const fullConversion = dateStr => getDate(getFirstKey(dateStr)) const sorter = (a, b) => fullConversion(a) < fullConversion(b) ? -1 : 1 const result = data.sort(sorter) console.dir(result) 

Assuming that the dates are in MM-DD-YYYY format, you can sort them by reformatting as ISO 8601 and using localeCompare to sort as strings. 假设日期采用MM-DD-YYYY格式,则可以通过将其重新格式化为ISO 8601并使用localeCompare对其进行排序来对它们进行排序。 That avoids the built-in Date parser and associated issues, eg 这样可以避免内置的日期解析器和相关问题,例如

 var data = [ {'12-11-2018': 'NA' }, { '12-05-2018': 'NA' }, { '12-09-2018': 'pass' }, { '12-07-2018': 'pass' }, { '12-10-2018': 'pass' }, { '12-08-2018': 'pass' }, { '12-06-2018': 'pass' } ]; let mix = d => d.replace(/(\\d+)-(\\d+)-(\\d+)/,'$3$1$2'); let key = Object.keys; data.sort((a, b) => mix(key(a)[0]).localeCompare(mix(key(b)[0]))); console.log(JSON.stringify(data).replace(/,/g,',\\n ')); 

You need to use Array.sort() to sorting array. 您需要使用Array.sort()对数组进行排序。 So use it and in function get key of object (date) using Object.keys() and convert it to date object and then compare it. 因此使用它,并在函数中使用Object.keys()获取对象(日期)的键,并将其转换为日期对象,然后进行比较。

var res = arr.sort((a,b) => new Date(Object.keys(a)[0]) - new Date(Object.keys(b)[0]));

 var arr = [ {'12-11-2018': 'NA' }, { '12-05-2018': 'NA' }, { '12-09-2018': 'pass' }, { '12-07-2018': 'pass' }, { '12-10-2018': 'pass' }, { '12-08-2018': 'pass' }, { '12-06-2018': 'pass' } ]; var res = arr.sort((a,b) => new Date(Object.keys(a)[0]) - new Date(Object.keys(b)[0])); console.log(res); 


Update: 更新:

The dates format isn't javascript valid date format , so maybe the code doesn't work in some browser. date格式不是javascript有效的date格式 ,因此该代码可能无法在某些浏览器中运行。 You can convert dates to javascript valid format to preventing this behavior. 您可以将日期转换为javascript有效格式,以防止出现这种情况。

let validDate = obj => {
  let arr = Object.keys(obj)[0].split('-');
  return new Date([arr[2], arr[0], arr[1]].join('-'));
};
let res = arr.sort((a,b) => validDate(a) - validDate(b));

 let arr = [ {'12-11-2018': 'NA' }, { '12-05-2018': 'NA' }, { '12-09-2018': 'pass' }, { '12-07-2018': 'pass' }, { '12-10-2018': 'pass' }, { '12-08-2018': 'pass' }, { '12-06-2018': 'pass' } ]; let validDate = obj => { let arr = Object.keys(obj)[0].split('-'); return new Date([arr[2], arr[0], arr[1]].join('-')); }; let res = arr.sort((a,b) => validDate(a) - validDate(b)); console.log(res); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM