2017-10-14 32 views
0

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

只有短信有'scheduled_at'道具吗? –

+0

@OriDrori,是的。其他人应该像以前一样使用'created_at',但短信需要使用'scheduled_at'。所以我可以按照相关顺序给出一个列表 – senty

+0

请提供您想要使用的数据结构的实际完整示例。很难从你的描述中辨别出来。 –

回答

1

你可以使用||拿到第一发现是有两个属性,假设每个对象有两个属性中的至少一个,但scheduled_at得到优先:

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

这似乎是一个很好的方法,但短信具有'created_at'属性以及'scheduled_at',我认为它是按'created_at'排序,而不是在 – senty

+1

排定。情况不应该如此:'scheduled_at'被采用在回落到'created_at'之前存在。如果一个对象具有两个属性,则会使用'scheduled_at'。 – trincot

+0

是的,我很抱歉。它像魅力一样工作!感谢百万 – senty

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

但sms_messages有'scheduled_at'和'created_at'两个属性。我认为这不会解决这个问题,因为它 – senty

+0

在我的示例中,它优先考虑'scheduled_at'属性,然后回退到'created_at'。所以如果'scheduled_at'出现在对象上,它将被'sheduled_at'排序。 – cyrix