I have an array, i need to sort the array based on one property if that exists.
const arr = [{
"item_name": "Cake",
"quantity": 1,
},
{
"item_name": "Choclate",
"out_of_stock_detail": {
"out_of_stock_quantity": 1
},
"quantity": 3,
}
]
let output = arr.sort((a, b) => {
if (a.out_of_stock_detail) {
return 1
} else {
return -1
}
})
console.log(output)
Expected output what I am looking out to get.
const result = [{
"item_name": "Choclate",
"out_of_stock_detail": {
"out_of_stock_quantity": 1
},
"quantity": 3,
},
{
"item_name": "Cake",
"quantity": 1,
}
]
Here's an option. Create a numeric value based on the existence of the property then return the comparison. I also added a second sort so highest quantities are first.
const arr = [{
"item_name": "Cake",
"quantity": 1,
},
{
"item_name": "Choclate",
"out_of_stock_detail": {
"out_of_stock_quantity": 1
},
"quantity": 3,
},
{
"item_name": "Vanilla",
"out_of_stock_detail": {
"out_of_stock_quantity": 1
},
"quantity": 9,
}
]
let output = arr.sort((a, b) => {
let aa = a.hasOwnProperty('out_of_stock_detail') ? 1 : -1
let bb = b.hasOwnProperty('out_of_stock_detail') ? 1 : -1
return bb - aa;
}).sort((a, b) => +b.quantity - +a.quantity)
console.log(output)
Just a slightly other approach by taking a boolean and taking the delta of it.
BTW, Array#sort
sorts in situ (mutating the array).
const
array = [{ item_name: "Cake", quantity: 1 }, { item_name: "Choclate", out_of_stock_detail: { out_of_stock_quantity: 1 }, quantity: 3 }];
array.sort((a, b) =>
('out_of_stock_detail' in b) - ('out_of_stock_detail' in a)
);
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Didn't you just mix up the 1 and -1?
const arr = [
{
"item_name": "Cake",
"quantity": 1,
},
{
"item_name": "Choclate",
"out_of_stock_detail": {
"out_of_stock_quantity": 1
},
"quantity": 3,
}
]
let output = arr.sort((a,b) => {
if(a.out_of_stock_detail){
return -1
}else {
return 1
}
})
console.log(output)