Так что посмотрите на это:
const a = { id: 'a', timestamp: 1570790874500 }
const b = { id: 'b' }
В какой -то момент у вас могут быть некоторые данные, подобные этому, и вы можете попробовать сравнение, думая, что определенное значение всегда будет выше и правдивее, чем неопределенное.
Вы можете попытаться сортировать их, ожидая, что неопределенные временные метки упадут на дно. Но они не будут.
> const c = [b, a]
> c.sort((i, j) => i.timestamp > j.timestamp)
(2) [{…}, {…}]
0: {id: "b"}
1: {id: "a", timestamp: 1570790874500}
Давайте посмотрим на некоторые сравнения, которые на самом деле нам не помогают.
> undefined > 1570790874500 false > 1570790874500 > undefined false
Лучшее, что можно сделать в этой ситуации, – это проверить существование поля временной метки в рамках предиката сортировки и сравнить значения только при наличии поля. В зависимости от того, хотите ли вы сначала или последнее, вы хотите, чтобы объекты с неопределенным полем вы изменили, какой объект вы проверяете на метку времени и возвращаете True, когда они не определены.
Давайте создадим некоторые данные.
> const list = [
{ id: 'a', timestamp: 1535090874500 },
{ id: 'b' },
{ id: 'c' },
{ id: 'd', timestamp: 1570790874500 },
{ id: 'e', timestamp: 1510790874500 }
]
Итак, для неопределенного последнего вы проверяете первый пройденный объект.
> list.sort((a, b) => !!a.timestamp ? a.timestamp > b.timestamp : true)
[ { id: 'e', timestamp: 1510790874500 },
{ id: 'a', timestamp: 1535090874500 },
{ id: 'd', timestamp: 1570790874500 },
{ id: 'c' },
{ id: 'b' } ]
И для сначала неопределенное, вы проверяете второй объект, пройденный.
> list.sort((a, b) => !!b.timestamp ? a.timestamp > b.timestamp : true)
[ { id: 'b' },
{ id: 'c' },
{ id: 'e', timestamp: 1510790874500 },
{ id: 'a', timestamp: 1535090874500 },
{ id: 'd', timestamp: 1570790874500 } ]
И, конечно же, сравнение здесь, A.TimESTAMP> B.TimestAmp Определяет порядок сортировки объектов, где поле это настоящее время.
Оригинал: “https://dev.to/adamkdean/sorting-objects-with-undefined-values-5fdj”