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?

snoopy25
  • 1,346
  • 4
  • 12
  • 15
  • 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? – Mike Cluck Jan 16 '17 at 21:22
  • I should probably set in my question a.key["name"] what is equal to a.key.name – snoopy25 Jan 16 '17 at 21:26

2 Answers2

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);
ssc-hrep3
  • 15,024
  • 7
  • 48
  • 87
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);
Abhinav Galodha
  • 9,293
  • 2
  • 31
  • 41