Сортировка массива состояний реакции - PullRequest
0 голосов
/ 11 июля 2020

Я не могу отсортировать массив объектов, хранящихся в состоянии перехвата реакции. Этот массив предоставляется в плоский список после сортировки.

const { notifications } = useContext(MainContext);
const [sortedNotifications, setSortedNotifications] = useState([]);

useEffect(() => {
    setSortedNotifications(
        [...notifications].concat([]).sort(function(x, y){
            return new Date(y.created_at).getTime() - new Date(x.created_at).getTime();
        })
    )
}, [notifications]);

return <View style={{ flex: 1,  backgroundColor: "white", }}>
    {notifications !== null && notifications.length > 0 ? <FlatList 
        vertical
        contentContainerStyle={{ paddingRight: 20, paddingLeft: 20, paddingBottom: 20, paddingTop: 20}}
        showsVerticalScrollIndicator={false}
        style = {styles.flatListStyle}
        data = {sortedNotifications} 
        keyExtractor = {(item,i) => `key-${item.title}-${i}`}
        renderItem = {({ item }) => {
        return <TouchableOpacity activeOpacity={0.8} style={styles.viewStyle} onPress={() => props.navigation.navigate("Notification", { n: item })}>
                <Text style={styles.textStyle}>{Capitalize(item.title)}</Text>
                <Text style={styles.text2Style}>Received {moment.utc(item.created_at).fromNow()}</Text>
        </TouchableOpacity>
    }}></FlatList> : <View></View>}
</View>

нет изменений в положении объектов. любая помощь будет оценена

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Хорошо, после 4-6 часов попыток я наконец нашел решение. Проблема возникает из-за формата метки времени ECMAScript.

Формат моей метки времени: «ГГГГ-ММ-ДД ЧЧ: ММ: СС»

Поддерживаемая метка времени ECMAScript: «ГГГГ-ММ-ДДТЧЧ: ММ: СС »-« Т »

Рабочий код:

const sorted = notifications.slice().sort((x, y) => {
      var dateStringX = x.created_at.replace(" ", "T");
      var dateStringY = y.created_at.replace(" ", "T");
            
      return new Date(dateStringY).getTime() - new Date(dateStringX).getTime(); 
});

setNotifications(sorted);
0 голосов
/ 11 июля 2020

Не уверен, исходя из кода, но что такое notification.created_at? это в эпохмилли? это просто число? Если это так, нет необходимости преобразовывать его в Date, а затем запускать .getTime (). Вы должны иметь возможность просто отсортировать x.created_at - y.created_at. Вероятно, в этом и может быть проблема.

Кроме того, вы можете немного упростить этот код до примерно такого: , так как вам не нужно setState.

Надеюсь, что это поможет!

...