简体   繁体   中英

How to order by 'something' in React Native FlatList?

Here is my entire code at Home.js file

export default function Home({navigation}) {

const [reviews, setReviews] = useState([
    { title: 'Alfa Romeo 147 1.9JTD', rating: 2020, body: 340000, sg: ['ABS ',  'CD ', 'ESP '], key: '1' },
    { title: 'Gotta Catch Them All (again)', body: 'lorem ipsum', key: '2' },
    { title: 'Not So "Final" Fantasy', body:'lorem ipsum', key: '3' },
    { title: 'Alfaromeo', rating: 3200, body: 'blablabla', first:'loremlo', key: '4' },
    { title: 'Gotta Catch Them All (again)', rating: 4, body: 'lorem ipsum', key: '5' },
    { title: 'Not So "Final" Fantasy', rating: 3, body: 'lorem ipsum', key: '6' },
    { title: 'Alfaromeo', rating: 3200, body: 'sadaa', key: '7' },
    { title: 'Gotta Catch Them All (again)', rating: 4, body: 'lorem ipsum', key: '8' },
    
  ]);

 return (
<View style={styles.container}>
<FlatList data={reviews} renderItem={({ item }) => (
    <TouchableOpacity onPress={() => navigation.navigate('ReviewDetails', item)}>
        
        <View style={styles.content}>
            <Image
            style={styles.image}
            source={{
            uri: 'https://www.autoplac-cg.me/storage/1871/conversions/5f9eb91821de1_20FB3486-4A0A-4B4A-B13C-CAE912950E22-thumb.jpg',
            }}
            />
            <Text style={styles.headertext}>{item.title }</Text>
            <Text style={styles.infotext}>{item.rating}god. | {item.body}km <Text style={styles.collapse}>+</Text></Text>
        </View>
    </TouchableOpacity>
  )} />
</View>

); }

So I want to put first on FlatList that review who has in array 'first', so in code its fourth. How I can do that?

I want to this be first on FlatList

{ title: 'Alfaromeo', rating: 3200, body: 'blablabla', first:'loremlo', key: '4' }

I believe that the best way to do that is to sort the data as needed and then render it with FlatList.

The sort logic may be the way you need, which means that you are free to "order by 'anything'" if you wish.

According to the data set and information you provided, the business rule, as I understood, is to show the items with fisrt flag at first place. So, the sorting could be like this:

 export default function Home({navigation}) { const [reviews, setReviews] = useState([ { title: 'Alfa Romeo 147 1.9JTD', rating: 2020, body: 340000, sg: ['ABS ', 'CD ', 'ESP '], key: '1' }, { title: 'Gotta Catch Them All (again)', body: 'lorem ipsum', key: '2' }, { title: 'Not So "Final" Fantasy', body:'lorem ipsum', key: '3' }, { title: 'Alfaromeo', rating: 3200, body: 'blablabla', first:'loremlo', key: '4' }, { title: 'Gotta Catch Them All (again)', rating: 4, body: 'lorem ipsum', key: '5' }, { title: 'Not So "Final" Fantasy', rating: 3, body: 'lorem ipsum', key: '6' }, { title: 'Alfaromeo', rating: 3200, body: 'sadaa', key: '7' }, { title: 'Gotta Catch Them All (again)', rating: 4, body: 'lorem ipsum', key: '8' }, ]); function renderItem(item) { return ( <TouchableOpacity onPress={() => navigation.navigate('ReviewDetails', item)}> <View style={styles.content}> <Image style={styles.image} source={{ uri: 'https://www.autoplac-cg.me/storage/1871/conversions/5f9eb91821de1_20FB3486-4A0A-4B4A-B13C-CAE912950E22-thumb.jpg', }} /> <Text style={styles.headertext}>{item.title}</Text> <Text style={styles.infotext}>{item.rating}god. | {item.body}km <Text style={styles.collapse}>+</Text></Text> </View> </TouchableOpacity> ); } function sortData() { let sortedArray = []; // If the item contains "first" property, it will be placed at the beginning of the sortedArray, else it will be at the end of it reviews.forEach(review => ( review.first ? sortedArray = [review, ...sortedArray] : sortedArray.push(review) )); return sortedArray; } return ( <View style={styles.container}> <FlatList data={sortData()} renderItem={({ item }) => renderItem(item)} /> </View> ); }

I moved the code to render an item to a separated function just for convenience

Use array.sort with providing compare function

See: https://www.w3schools.com/js/js_array_sort.asp

You can use

reviews.sort((a, b) => a.rating - b.rating)

This will sort your reviews array.

You can do is

var reviews1 = reviews.filter(function (el) {
  return el["first"];
});

var reviews2 = reviews.filter(function (el) {
  return el["first"] === undefined;
});

const reviewsFinalArray = reviews1.concat(reviews2); // Your result

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM