Sort an array of objects in React and render them

JavascriptReactjs

Javascript Problem Overview


I have an array of objects containing some information. I am not able to render them in the order I want and I need some help with that. I render them like this:

this.state.data.map(
    (item, i) => <div key={i}> {item.matchID} {item.timeM} {item.description}</div>
)

Is it possible to sort them ascending with item.timeM in that map()-function or do I have to sort them before i use map?

Javascript Solutions


Solution 1 - Javascript

This might be what you're looking for:

// ... rest of code

// copy your state.data to a new array and sort it by itemM in ascending order
// and then map 
const myData = [].concat(this.state.data)
    .sort((a, b) => a.itemM > b.itemM ? 1 : -1)
    .map((item, i) => 
        <div key={i}> {item.matchID} {item.timeM}{item.description}</div>
    );

// render your data here...

The method sort will mutate the original array . Hence I create a new array using the concat method. The sorting on the field itemM should work on sortable entities like string and numbers.

Solution 2 - Javascript

You will need to sort your object before mapping over them. And it can be done easily with a sort() function with a custom comparator definition like

var obj = [...this.state.data];
obj.sort((a,b) => a.timeM - b.timeM);
obj.map((item, i) => (<div key={i}> {item.matchID}  
                      {item.timeM} {item.description}</div>))

Solution 3 - Javascript

this.state.data.sort((a, b) => a.item.timeM > b.item.timeM).map(
    (item, i) => <div key={i}> {item.matchID} {item.timeM} {item.description}</div>
)

Solution 4 - Javascript

const list = [  { qty: 10, size: 'XXL' },  { qty: 2, size: 'XL' },  { qty: 8, size: 'M' }]

list.sort((a, b) => (a.qty > b.qty) ? 1 : -1)

console.log(list)

Out Put :

[  {    "qty": 2,    "size": "XL"  },  {    "qty": 8,    "size": "M"  },  {    "qty": 10,    "size": "XXL"  }]

Solution 5 - Javascript

Try lodash sortBy

import * as _ from "lodash";
_.sortBy(data.applications,"id").map(application => (
	console.log("application")
	)
)

Read more : lodash.sortBy

Solution 6 - Javascript

Chrome browser considers integer value as return type not boolean value so,

this.state.data.sort((a, b) => a.item.timeM > b.item.timeM ? 1:-1).map(
    (item, i) => <div key={i}> {item.matchID} {item.timeM} {item.description}</div>
)

Solution 7 - Javascript

this.state.data.sort((a, b) => a.objKey > b.objKey ? 1:-1).map((objKey, index))

Solution 8 - Javascript

This approach worked for me

const list = [
  { price: 10, plan: 'a' },
  { price: 2, plan: 'b' },
  { price: 8, plan: 'c' }
];
this.setState({ planList: list.sort((a,b)=> a.price-b.price)  });


render(){
   return(){
      <div>
          this.state.planList !== undefined && this.state.planList !== null && 
          this.state.planList !== '' && this.state.planList.map((ele, index) => {
              return (
                 <div key={index}> {ele.price}{ele.plan}</div>
              )
          })
      </div>
  }
}

Thank You

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKimRView Question on Stackoverflow
Solution 1 - JavascriptMμ.View Answer on Stackoverflow
Solution 2 - JavascriptShubham KhatriView Answer on Stackoverflow
Solution 3 - JavascriptVincenzo CentofantiView Answer on Stackoverflow
Solution 4 - JavascriptANKIT DETROJAView Answer on Stackoverflow
Solution 5 - JavascriptArun KView Answer on Stackoverflow
Solution 6 - JavascriptPraveen pravView Answer on Stackoverflow
Solution 7 - JavascriptvandanaView Answer on Stackoverflow
Solution 8 - JavascriptAtit MoreView Answer on Stackoverflow