使用不同的键对多个数组对象进行排序

时间:2017-10-14 17:31:45

标签: javascript arrays sorting ecmascript-6

之前,我将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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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