【问题标题】:How to sort array of object based on key that is date using javascript?如何使用javascript根据日期键对对象数组进行排序?
【发布时间】:2019-05-12 09:17:21
【问题描述】:

我在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' } 
]

我想使用日期升序对其进行排序。

预期输出

[ 
  { '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' } 
]

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 我相信您的预期输出中有错误,'12-06-2018' 在输入中是 'pass',但在输出中是 'NA'

标签: javascript arrays sorting date object


【解决方案1】:

您需要使用Array.sort() 对数组进行排序。所以使用它并在函数中使用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);

更新:

日期格式不是javascript valid date format,所以可能代码在某些浏览器中不起作用。您可以将日期转换为 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);

【讨论】:

  • '12-08-2018' 不是 ECMA-262 支持的格式,因此解析依赖于实现,您不能确定使用内置的对象是否会按预期排序解析器。
  • 颠倒顺序没有帮助。 OP 是 m-d-y 顺序,反转给出 y-d-m 不太可能按要求解析。
【解决方案2】:

假设日期为 MM-DD-YYYY 格式,您可以通过重新格式化为 ISO 8601 并使用 localeCompare 将其排序为字符串。这避免了内置日期解析器和相关问题,例如

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 '));

【讨论】:

    【解决方案3】:

    您可以获取每个对象的第一个键,将其转换为日期,然后通过比较这些日期来运行排序:

    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)

    【讨论】:

    • 值得一票,因为您正确解析了时间戳。 :-)
    • @RobG 哈,谢谢!当谈到 js 中的时间戳时,我总是很谨慎
    猜你喜欢
    • 1970-01-01
    • 2018-12-27
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多