vsiege
vsiege

Reputation: 315

Sort an array of objects based on first word

I'd like to be able to sort an array an array of objects in JavaScript based on the first word in the string. Currently the sort function I'm using uses all words in the string.

JSON data:

"awds": [
    {"awd":"adobe edge award"},
    {"awd":"besty"},
    {"awd":"c award"},
    {"awd":"awwward award"},
    {"awd":"desk award"},
    {"awd":"adobe edge award"},
    {"awd":"creative edge award"},
    {"awd":"snoogle edge award"},
    {"awd":"scuba edge award"},
    {"awd":"xidoe edge award"}
]

JavaScript:

var compareNames = function(a, b) {
    var nameA = a.awd.toLowerCase();
    var nameB = b.awd.toLowerCase();
    if (nameA > nameB) { return 1; }
    return 0;
};

Current Output:

adobe edge award
besty
c award
awwward award
desk award
adobe edge award
creative edge award
snoogle edge award
scuba edge award
xidoe edge award

Desired Output:

adobe edge award
adobe edge award
awwward award
c award
creative edge award
scuba edge award
snoogle edge award
xidoe edge award

Upvotes: 0

Views: 2694

Answers (4)

Jashwant
Jashwant

Reputation: 28995

var o = [
    {"awd":"adobe edge award"},
    {"awd":"besty"},
    {"awd":"c award"},
    {"awd":"awwward award"},
    {"awd":"desk award"},
    {"awd":"adobe edge award"},
    {"awd":"creative edge award"},
    {"awd":"snoogle edge award"},
    {"awd":"scuba edge award"},
    {"awd":"xidoe edge award"}
];

o.sort(function(a, b) {
    var nameA = a.awd.toLowerCase();
    var nameB = b.awd.toLowerCase(); 
    if(nameA === nameB) return 0; 
    return nameA > nameB ? 1 : -1;
});

console.log(o);

Demo

Upvotes: 1

Salman Arshad
Salman Arshad

Reputation: 272066

  1. The sort callback should return negative, 0, positive number depending on whether argument 1 is less than, equal to, or greater than argument 2
  2. Sorting is done on the original so you do not have to "assign" the result
  3. You can use regex to extract the first word (I don't see why you want to sort that way)
awds.sort(function (a, b) {
    var aword = a.awd.toLowerCase().match(/[^ ]+/)[0];
    var bword = b.awd.toLowerCase().match(/[^ ]+/)[0];
    return aword == bword ? 0 : (aword < bword ? -1 : 1);
});

Upvotes: 1

kennebec
kennebec

Reputation: 104760

Your method will work if you return -1 when the first item is not greater than the second-

   var compareNames = function(a, b) {    
    var nameA = a.awd.toLowerCase();
    var nameB = b.awd.toLowerCase();
    if(nameA==nameB) return 0;
    return (nameA > nameB)? 1:-1; 
};

Upvotes: 0

marekful
marekful

Reputation: 15351

You can use Array.sort with compare function. See https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort

Upvotes: 1

Related Questions