Sorting an array by key objects

I have the following structure:

var participant0 = {
    name : "",
    nickname : "",
    number "99999"
} ;

var participant1 = {
    name : "bbb",
    nickname : "",
} ;

var participant2 = {
    name : "",
    nickname : "aaa"
} ;

var participant3 = {
    name : "ccc",
    nickname : ""
} ;

And I have an array containing instances of the structure:

var array = [participant0, participant3, participant1, participant2];

I would like to sort this array alphabetically. First by name, second by nickname. If these two keys do not exist, I would like to check the key number and put this item at the end of the sort list.

Expected Result:

var array = [participant2, participant1, participant3, participant0];

(To sort an object by "aaa", "bbb", "ccc", "9999")

The following code works fine for sorting by name or alias, but I don’t know how to put an item at the end of the sort list if there is a numeric key:

fav_list.sort(function(x, y) {
              return (x.participant.name || x.participant.nickname).localeCompare(y.participant.name || y.participant.nickname);
            });
+4
source share
5 answers

, , . :

fav_list.sort(function(x, y) {
    var xvalue = x.participant.name || x.participant.nickname;
    var yvalue = y.participant.name || y.participant.nickname;
    // By name if both have names
    if (xvalue && yvalue) {
        return xvalue.localeCompare(yvalue);
    }
    // Names always come before numbers
    if (xvalue) {
        return -1;
    }
    if (yvalue) {
        return 1
    }
    // Otherwise compare numbers
    return (x.participant.number || 0) - (y.participant.number || 0);
});

() .

, , , , , , participant .

, :

var participant0 = {
  name: "",
  nickname: "",
  number: "99999",
  debug: 0
};

var participant1 = {
  name: "bbb",
  nickname: "",
  debug: 1
};

var participant2 = {
  name: "",
  nickname: "aaa",
  debug: 2
};

var participant3 = {
  name: "ccc",
  nickname: "",
  debug: 3
};

var array = [
  {
    participant: participant0
  },
  {
    participant: participant3
  },
  {
    participant: participant1
  },
  {
    participant: participant2
  }
];

array.sort(function(x, y) {
  var xvalue = x.participant.name || x.participant.nickname;
  var yvalue = y.participant.name || y.participant.nickname;
  // By name if both have names
  if (xvalue && yvalue) {
    return xvalue.localeCompare(yvalue);
  }
  // Names always come before numbers
  if (xvalue) {
    return -1;
  }
  if (yvalue) {
    return 1
  }
  // Otherwise compare numbers
  return (x.participant.number || 0) - (y.participant.number || 0);
});
array.forEach(function(entry) {
  snippet.log(entry.participant.debug);
});
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.imtqy.com/simple-snippets-console/snippet.js"></script>
Hide result
+2

.

fav_list.sort(function(x,y) {
    var xname = x.name || x.nickname || "\uffff"+x.number;
    var yname = y.name || y.nickname || "\uffff"+y.number;
    return xname.localeCompare(yname);
});

"\uffff" - ;)

+1

:

\uffff ,

var participant0 = {
    name : "",
    nickname : "",
    number: "99999"
} ;

var participant1 = {
    name : "bbb",
    nickname : ""
} ;

var participant2 = {
    name : "",
    nickname : "aaa"
} ;

var participant3 = {
    name : "ccc",
    nickname : ""
} ;
var array = [participant0, participant3, participant1, participant2];
console.log(array.sort(function(x,y) {
    var val1 = x.name || x.nickname || "\uffff"+x.number;
    var val2 = y.name || y.nickname || "\uffff"+y.number;
    return xname.localeCompare(val2);
}))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
Hide result
0
function sortObject(object) { // sort Object by key
    var sorted = {},
        key, a = [];
    for (key in object) {
        if (object.hasOwnProperty(key)) {
            a.push(key);
        }
    }
    a.sort();
    for (key = 0; key < a.length; key++) {
        sorted[a[key]] = object[a[key]];
    }
    return sorted;
}

function sortArray(arr){//sort array of objects
    var array=[];
    for(var i=0;i<arr.length;i++){
        array.push(sortObject(arr[i]));
    }
    return array;
}

var arr=[{a:'1',c:'2',b:'3'},{c:'1',b:'2',a:'3'}];
console.log('===>',sortArray(arr));
0

.

  var numbers = [];    
fav_list.sort(function(x, y) {  
             if(!isNaN(x)){
              numbers.push(x);
             continue;
             }
                  return (x.participant.name || x.participant.nickname).localeCompare(y.participant.name || y.participant.nickname);
                });
    fav_list.push(numbers);
-1

Source: https://habr.com/ru/post/1584445/


All Articles