2017-10-14 2 views
0

Avant, je combinais 2 baies dans un tableau et en utilisant sort(), j'ai été capable de les trier par created_at.Tri des objets de plusieurs tableaux avec des clés différentes

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

Maintenant, je suis dans un autre scénario. Je veux ajouter un tableau de plus (sms_messages) dans ce tableau et le vouloir cependant commander par son champ scheduled_at.

Est-il possible de l'atteindre avec cette approche?

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

Est-ce que seulement sms a le propulsé 'scheduled_at'? –

+0

@OriDrori, oui. D'autres devraient utiliser 'created_at' comme avant, mais sms doit utiliser' scheduled_at'. Donc, je peux donner une liste dans l'ordre connexe – senty

+0

S'il vous plaît fournir un exemple complet réel de la structure de données que vous souhaitez travailler avec. C'est difficile à discerner de votre description. –

Répondre

1

Vous pouvez utiliser || pour obtenir la première des deux propriétés qu'il trouve être là, en supposant que chaque objet a au moins l'une des deux propriétés, mais scheduled_at obtient la priorité:

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

Cela semble être une bonne approche, mais sms a la propriété 'created_at' ainsi que' scheduled_at' et je pense que c'est ordering par 'created_at' plutôt que prévu à – senty

+1

Cela ne devrait pas être le cas:' scheduled_at' est pris s'il existe avant de retomber dans 'created_at'. Si un objet a les deux propriétés, 'scheduled_at' sera utilisé. – trincot

+0

Oui, je suis désolé. Cela fonctionne comme le charme! Merci un million – senty

0

Il suffit de cocher quelle propriété existe et l'utilise pour trier les objets.

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

Mais sms_messages a les deux propriétés 'scheduled_at' et' created_at'. Je pense que cela ne résoudra pas cela à cause de cela – senty

+0

Dans mon exemple, il priorise l'attribut 'scheduled_at' et retombe ensuite dans' created_at'. Donc, si 'scheduled_at' est présent sur l'objet, il sera trié par' sheduled_at'. – cyrix