2

I have array of objects that looks like this:

var array = [{
key: {name: "C Some name", id: 123},
value: {value: 1, element:"some element"}
}, {
key: {name: "A Name 2", id: 1234},
value: {value: 4, element:"some element 2"}
}, {
key: {name: "B Other name", id: 1235},
value: {value: 2, element:"some element 3"}
}] 

I want to sort this array by name(inside key object) and value(inside value object). Result of sort by name should return this result:

[{
key: {name: "A Name 2", id: 1234},
value: {value: 4, element:"some element 2"}
}, {
key: {name: "B Other name", id: 1235},
value: {value: 2, element:"some element 3"}
}, {
key: {name: "C Some name", id: 123},
value: {value: 1, element:"some element"}
}]

And result of sort by value should look like this:

[{  key: {name: "C Some name", id: 123},
    value: {value: 1, element:"some element"}
}, {
key: {name: "B Other name", id: 1235},
    value: {value: 2, element:"some element 3"}
}, {
key: {name: "A Name 2", id: 1234},
    value: {value: 4, element:"some element 2"}
}]

I tried this for sort by name:

array.sort(a,b){
return a.key["name"] - b.key["name"];
}

And this for sort by value:

array.sort(a,b){
return a.key["value"] - b.key["value"];
}

but it doesn't work. How can I sort this array?

2
  • 1
    a.key[name] means you have some variable called name and you want to access a property of a.key with that matching name. Have you tried a.key.name for getting the correct value? Commented Jan 16, 2017 at 21:22
  • I should probably set in my question a.key["name"] what is equal to a.key.name Commented Jan 16, 2017 at 21:26

2 Answers 2

4

You should compare the strings with >.

var array = [{
    key: {name: "C Some name", id: 123},
    value: {value: 1, element:"some element"}
}, {
    key: {name: "A Name 2", id: 1234},
    value: {value: 4, element:"some element 2"}
}, {
    key: {name: "B Other name", id: 1235},
    value: {value: 2, element:"some element 3"}
}];

var newArray = array.sort(function(first, second) {
    var a = first.key.name;
    var b = second.key.name;
    
    if(a > b) {
        return 1;
    } else if(a < b) {
        return -1;
    } else {
        return 0;
    }
});

console.log(newArray);

Sign up to request clarification or add additional context in comments.

2 Comments

Why the downvote?
With due respect to moderators, sometimes moderation is excessive !
1

One of the way to go is like this.

Basically, using the Arrow function for a Sorting callback and then comparing the 2 string by using localeCompare.
first.key.name.localeCompare(second.key.name)

For integer values you can directly compare them by doing a subtraction.
first.value.value - second.value.value.

The important thing is to know how the comparer function works for 2 values a and b.

  • Less than 0: Sort a to be a lower index than b.

  • Zero: a and b should be considered equal, and no sorting performed.

  • Greater than 0: Sort b to be a lower index than a

var array = [{
key: {name: "C Some name", id: 123},
value: {value: 1, element:"some element"}
}, {
key: {name: "A Name 2", id: 1234},
value: {value: 4, element:"some element 2"}
}, {
key: {name: "B Other name", id: 1235},
value: {value: 2, element:"some element 3"}
}] 

var resultSortedByName = array.sort( (first,second) => {return first.key.name.localeCompare(second.key.name)} );
console.log(resultSortedByName);

var resultSortedByValue = array.sort( (first,second) => {return (first.value.value - second.value.value)} );
console.log(resultSortedByValue);

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.