【问题标题】:Sort array of objects according to numbers inside objects then according to string inside the object [duplicate]根据对象内部的数字对对象数组进行排序,然后根据对象内部的字符串[重复]
【发布时间】:2021-07-20 15:49:06
【问题描述】:

我知道我可以制定一个算法来对我拥有的数组进行排序,但我想知道最好和最优化的方式

这是我现在拥有的数组,我想根据年份对其进行排序,这样 2021 年的值将首先出现,然后是 2022 年,依此类推,然后我想相对于月份进行排序,以便最终数组就像

[
 0: {month:'Aug', year:2021},
 1: {month:'Jul', year:2022},
 2: {month:'May', year:2100},
]

而且我的数组长度永远不会超过 12

【问题讨论】:

  • 这可能是您正在寻找的东西:Array.prototype.sort()。您需要编写自己的比较函数,这应该不难。

标签: javascript arrays reactjs sorting javascript-objects


【解决方案1】:

const arr = [
  { month: "Aug", year: 2021 },
  { month: "Jul", year: 2022 },
  { month: "May", year: 2100 },
];

const months = {
  Jan: 1,
  Feb: 2,
  Mar: 3,
  Apr: 4,
  May: 5,
  Jun: 6,
  Jul: 7,
  Aug: 8,
  Sep: 9,
  Oct: 10,
  Nov: 11,
  Dev: 12,
};

arr.sort((a, b) => {
  if (a.year < b.year) return -1;
  else if (a.year === b.year) {
    return months[a.month] - months[b.month];
  } else return 1;
});

console.log(arr);

也可以简化为

arr.sort((a, b) => {
  if (a.year === b.year) {
    return months[a.month] - months[b.month];
  } else return a.month - b.month;
});

感谢georg这个简洁的建议(我个人喜欢这种简洁)

const arr = [
  { month: "Aug", year: 2021 },
  { month: "Jul", year: 2022 },
  { month: "May", year: 2100 },
];

const months = {
  Jan: 1,
  Feb: 2,
  Mar: 3,
  Apr: 4,
  May: 5,
  Jun: 6,
  Jul: 7,
  Aug: 8,
  Sep: 9,
  Oct: 10,
  Nov: 11,
  Dev: 12,
};

arr.sort((a, b) => a.year - b.year || months[a.month] - months[b.month]);

console.log(arr);

【讨论】:

  • a.year - b.year || months[a.month] - months[b.month]
  • @georg 太简洁了。非常感谢...顺便说一句,我个人喜欢简洁的代码。
【解决方案2】:

您可以使用函数Array.prototype.sort(),它将比较函数作为参数:

const months = [
  "Jan",
  "Feb",
  "Mar",
  "Apr",
  "May",
  "Jun",
  "Jul",
  "Aug",
  "Sep",
  "Oct",
  "Nov",
  "Dec",
];

const array = [
  { month: "Aug", year: 2021 },
  { month: "Jul", year: 2022 },
  { month: "May", year: 2100 },
  { month: "Jan", year: 2100 },
];

console.log(
  array.sort((item1, item2) =>
    item1.year === item2.year
      ? months.indexOf(item1.month) - months.indexOf(item2.month)
      : item1.year - item2.year
  )
);

【讨论】:

  • 您的解决方案缺少按月排序的部分。
  • 确实,谢谢@BronislavRůžička 我会更新
猜你喜欢
  • 2020-05-03
  • 2021-09-09
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多