【问题标题】:Sorting multiple array objects with different keys使用不同的键对多个数组对象进行排序
【发布时间】:2017-10-14 17:31:44
【问题描述】:

之前,我将 2 个数组合并为一个数组,并使用 sort(),我能够按 created_at 对它们进行排序。

let result = [...item.messages, ...item.chat_messages]
result.sort((a, b) => new Date(b.created_at) - new Date(a.created_at))
item.messages = result

现在,我处于另一种情况。我想在这个数组中再添加一个数组(sms_messages),但希望它按其scheduled_at 字段排序。

用这种方法可以实现吗?

let result = [...item.messages, ...item.chat_messages, ...item.sms_messages]
// and order by messages' and chat_messages' created_at (like above) together as 
// sms_messages' sheduled_at

【问题讨论】:

  • 只有短信有scheduled_at 属性吗?
  • @OriDrori,是的。其他人应该像以前一样使用created_at,但短信需要使用scheduled_at。所以我可以按相关顺序给出一个列表
  • 请提供您要使用的数据结构的实际完整示例。很难从你的描述中辨别出来。

标签: javascript arrays sorting ecmascript-6


【解决方案1】:

您可以使用|| 来获取它发现的两个属性中的第一个,假设每个对象至少具有两个属性中的一个,但scheduled_at 优先:

result.sort((a, b) => 
    new Date(b.scheduled_at || b.created_at) - new Date(a.scheduled_at || a.created_at))

【讨论】:

  • 这似乎是一个不错的方法,但是 sms 有 created_atscheduled_at 属性,我认为它是由 created_at 订购而不是预定在
  • 不应该是这样:scheduled_at 在回退到 created_at 之前存在,则被采用。如果一个对象同时具有这两个属性,则将使用scheduled_at
  • 是的,很抱歉。它就像魅力一样工作!谢谢一百万
【解决方案2】:

只需检查存在哪个属性并使用它对对象进行排序。

const sortByDate = props => {
  return (a, b) => {
    let propA = props.find(p => a.hasOwnProperty(p));
    let propB = props.find(p => b.hasOwnProperty(p));
    if(!propA || !propB) return 0;
    return new Date(b[propB]) - new Date(a[propA]);
  };
}

result.sort(sortByDate(['scheduled_at', 'created_at']));

【讨论】:

  • 但是 sms_messages 有两个属性 scheduled_atcreated_at。我认为这不会解决这个问题
  • 在我的示例中,它优先考虑 scheduled_at 属性,然后回退到 created_at。因此,如果scheduled_at 出现在对象上,它将按sheduled_at 排序。
猜你喜欢
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
相关资源
最近更新 更多