Reputation: 197
I have an array of objects something like this
var itemArray = [
{
"name": "name1",
"flag": true,
},
{
"name": "name1",
"flag": false,
},
{
"name": "name2",
"flag": false,
},
{
"name": "name3",
"flag": true,
}
];
I am already sorting this by the name key using the following:
var sortedItems = sortByKey(itemArray, "name");
function sortByKey(array, key) {
return array.sort(function(a, b) {
var x = a[key];
var y = b[key];
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
});
How do i also sort it by the flag key alphabetically so the false flags appear before the true flags? (I can use a string instead of boolean on the flag property if this makes it simpler)
To clarify, what I am looking for is an array which would be returned like this for example:
[
{ name: "name_a", flag: false },
{ name: "name_a", flag: true },
{ name: "name_b", flag: false },
{ name: "name_b", flag: true},
{ name: "name_c", flag: true},
{ name: "name_d", flag: false},
]
Upvotes: 1
Views: 658
Reputation: 386604
You could use a proper callback, sort first by flag
and if equal then by name
.
var itemArray = [{ "name": "name1", "flag": true, }, { "name": "name1", "flag": false, }, { "name": "name2", "flag": false, }, { "name": "name3", "flag": true, }];
itemArray.sort(function (a, b) {
return a.name.localeCompare(b.name) || a.flag - b.flag;
}),
console.log(itemArray);
Upvotes: 1
Reputation: 2714
var sortedItems = sortByKey(itemArray, "name");
function sortByKey(array, key) {
return array.sort(function(a, b) {
if(a[key] == b[key]) {
return (a['flag'] ? -1 : 1);
} else {
var x = a[key];
var y = b[key];
return x.localeCompare(y);
}
});
Upvotes: 2
Reputation: 2714
var sortedItems = sortByKey(itemArray, "name");
function sortByKey(array, key) {
return array.sort(function(a, b) {
if(a['flag'] == f['flag']) {
var x = a[key];
var y = b[key];
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
} else {
return (a['flag'] ? -1 : 1);
}
});
Upvotes: 1