2017-10-14 1 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 필드로 지정하고 싶습니다.

이 방법으로 달성 할 수 있습니까?

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

sms에만'scheduled_at' 소품이 있습니까? –

+0

@OriDrori, 예. 다른 것들은 이전처럼'created_at'을 사용해야하지만 sms는'scheduled_at'를 사용해야합니다. 그래서 나는 관련된 순서로리스트를 줄 수 있습니다. – senty

+0

작업하고자하는 데이터 구조의 실제 예를 제공해주십시오. 당신의 설명을 식별하기가 어렵습니다. –

답변

1

당신은 각 개체는 두 속성 중 하나 이상을 가지고 가정, 거기로 찾아 두 속성의 첫 번째를 얻을 수 ||를 사용할 수 있지만 scheduled_at이 우선 도착 어떤 프로퍼티가 존재하고 그것을 객체들을 정렬하는데 사용한다.

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

그냥 확인 :

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