【问题标题】:How to sort by Year and Month in Javascript ES6如何在 Javascript ES6 中按年和月排序
【发布时间】:2018-05-01 22:26:08
【问题描述】:

我有一个这样组织的数组。

const array = [
  {
    Year: 2018,
    Month: 'Dec'
  },
  {
    Year: 2017,
    Month: 'Apr'
  },
  {
    Year: 2018,
    Month: 'Mar'
  },
  {
    Year: 2018,
    Month: 'Oct'
  },
  {
    Year: 2017,
    Month: 'Jan'
  },
  {
    Year: 2018,
    Month: 'Apr'
  }
]

我已经成功地按年或按月组织了数据,但是每次我尝试同时按两者组织数据时,最后组织数据的人都会取代之前的所有数据。我理解它为什么这样做,但似乎找不到解决方法。

const sortedByYear = array.sort((a, b) => a.Year - b.Year);

按年份排序很简单。

const sorted = sortedByYear.sort((a, b) => Months.indexOf(a.Month) - Months.indexOf(b.Month));

按月份排序。

我尝试在月份检查器中添加某种检查器,如果年份匹配则使用,但这并不能解决它如何排序的问题。

【问题讨论】:

标签: javascript arrays sorting ecmascript-6 indexof


【解决方案1】:

您必须将 两个 测试放在您的 sort 函数中:

const input = [
  {
    Year: 2018,
    Month: 'Dec'
  },
  {
    Year: 2017,
    Month: 'Apr'
  },
  {
    Year: 2018,
    Month: 'Mar'
  },
  {
    Year: 2018,
    Month: 'Oct'
  },
  {
    Year: 2017,
    Month: 'Jan'
  },
  {
    Year: 2018,
    Month: 'Apr'
  }
];
const Months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
input.sort((a, b) => {
  if (a.Year !== b.Year) return a.Year - b.Year;
  return Months.indexOf(a.Month) - Months.indexOf(b.Month)
});
console.log(input);

【讨论】:

    【解决方案2】:

    您可以使用 lodash sortBy 并将您想要排序的字段作为数组传递。

    const sorted = _.sortBy(array, ['Year', 'Month']);

    【讨论】:

      【解决方案3】:

      您可以使用year 和month 的组合来形成比较标准。 padStart 不适用于 IE,因此您可能需要一个 polyfill。

      const input = [
        {
          Year: 2018,
          Month: 'Dec'
        },
        {
          Year: 2017,
          Month: 'Apr'
        },
        {
          Year: 2018,
          Month: 'Mar'
        },
        {
          Year: 2018,
          Month: 'Oct'
        },
        {
          Year: 2017,
          Month: 'Jan'
        },
        {
          Year: 2018,
          Month: 'Apr'
        }
      ];
      const Months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
      input.sort((a, b) =>`${a.Year}${Months.indexOf(a.Month).toString().padStart(2,0)}` - `${b.Year}${Months.indexOf(b.Month).toString().padStart(2,0)}`
      );
      console.log(input);

      【讨论】:

        猜你喜欢
        • 2018-06-01
        • 2016-04-16
        • 2021-09-09
        • 2013-02-12
        • 1970-01-01
        • 2015-12-17
        • 1970-01-01
        • 2012-07-12
        • 1970-01-01
        相关资源
        最近更新 更多