Reputation: 49
I have buttons that are coming from API.
This is my buttons array output.
0: {uploaded: "User", id: 1, status: "A1"}
1: {uploaded: "User", id: 2, status: "A2"}
2: {uploaded: "User", id: 3, status: "A3"}
3: {uploaded: "User", id: 4, status: "A4"}
4: {uploaded: "User", id: 5, status: "A5"}
5: {uploaded: "User", id: 6, status: "A6"}
this is how I am mapping..
{buttons?.map((item) => (
<Button
outline
key={item.id}
disabled={isDisabled(item, status)}
onClick={onTap.bind(null, item)}
className={`statusName`}
>
{item.status}
</Button>
))}
Now I have a requirement when status named status: "A6" is available in API response I need to show the order of my buttons as A1 A6 A2 A3 A4 A5 when status: "A6" not available in API response I need to show the order of my buttons as is not available A1 A2 A3 A4 A5. How I can change the order sorting based on status: "A6" value.
Upvotes: 0
Views: 1281
Reputation: 10463
You can check if A6 is present and based on this use splice method to costruct new array
export default function App() {
let data = [
{ uploaded: "User", id: 1, status: "A1" },
{ uploaded: "User", id: 2, status: "A2" },
{ uploaded: "User", id: 3, status: "A3" },
{ uploaded: "User", id: 4, status: "A4" },
{ uploaded: "User", id: 5, status: "A5" },
{ uploaded: "User", id: 6, status: "A6" }
];
let a6Idx = data.findIndex((obj) => obj.status === "A6");
let newData = JSON.parse(JSON.stringify(data));
if (a6Idx >= 0) {
newData.splice(a6Idx);
newData.splice(1, 0, data[a6Idx]);
}
return (
<div>
{newData.map((obj, idx) => (
<button key={obj.id}>{obj.status}</button>
))}
</div>
);
}
Upvotes: 1
Reputation: 2347
There's a couple of ways you could approach this.
Is there a particular reason why "A6"
still comes after "A1"
?
My method is like so:
Array.prototype.move = function(from, to) {
this.splice(to, 0, this.splice(from, 1)[0]);
};
var buttonArray = [
{uploaded: "User", id: 1, status: "A1"},
{uploaded: "User", id: 2, status: "A2"},
{uploaded: "User", id: 3, status: "A3"},
{uploaded: "User", id: 4, status: "A4"},
{uploaded: "User", id: 5, status: "A5"},
{uploaded: "User", id: 6, status: "A6"}
]
var a6Index = buttonArray .findIndex(item => item.status === "A6")
// Since Arrays are zero-indexed, move to 1
buttonArray.move(a6Index, 1)
// [
// {uploaded: "User", id: 1, status: "A1"},
// {uploaded: "User", id: 6, status: "A6"},
// {uploaded: "User", id: 2, status: "A2"},
// {uploaded: "User", id: 3, status: "A3"},
// {uploaded: "User", id: 4, status: "A4"},
// {uploaded: "User", id: 5, status: "A5"}
// ]
The nice part about this method is that if "A6"
is not in your array, the array order will remain unchanged.
You can then map through your array as normal.
Upvotes: 0