2017-10-14 6 views
0

2つの配列を1つの配列に結合する前に、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 

ここでは別のシナリオです。私はこの配列にもう1つの配列(sms_messages)を追加したいが、それをscheduled_atフィールドで注文したい。

この方法で実現することはできますか?

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

smsには 'scheduled_at' propがありますか? –

+0

@OriDrori、はい。以前のように 'created_at'を使うべきですが、smsは' scheduled_at'を使う必要があります。したがって、私は関連した順序でリストを与えることができます – senty

+0

作業したいデータ構造の実際の完全な例を提供してください。あなたの説明から分かるのは難しいです。 –

答えて

1

どちらのプロパティが存在し、オブジェクトをソートするのに使用します。

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は 'scheduled_at'プロパティと' scheduled_at'プロパティを持っています。私はそれが – senty

+1

でスケジューリングされているのではなく、 'created_at'によって順序付けされていると思います。そうではないはずです:' scheduled_at'は'created_at'に落ちる前に存在します。オブジェクトに両方のプロパティがある場合、 'scheduled_at'が使用されます。 – trincot

+0

はい、申し訳ありません。それは魅力のように働いています!ありがとうございます。 – senty

0

だけチェック:あなたは、各オブジェクトは、両方の特性の少なくとも1つを持っているが、優先度を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

しかしsms_messagesには、 'scheduled_at'と' created_at'の両方のプロパティがあります。私はこれが原因でこれを解決できないと考えています – senty

+0

私の例では、 'scheduled_at'属性に優先順位を付け、' created_at'に落ちます。 'scheduled_at'がオブジェクトに存在する場合、' sheduled_at'によってソートされます。 – cyrix

関連する問題