Sorting using sortBy method not working in underscore

I am trying to sort an array of objects using underscore sortBy method the json is as follows

[
   {
      "styleId": 91,
      "styleName": "Style Label",
      "dataSourceId": 1,
      "dataSourceName": null,
      "stationeryId": 1,
      "stationeryName": null,
      "styleType": 1,
      "styleTypeName": "Labels",
      "isActive": true,
      "isPlainPaper": true,
      "isSystemMaintained": false,
      "isPublished": true,
      "designerUrl": null,
      "sourceStyleId": 0,
      "rowIndicatorCode": 2,
      "isDefault": null,
      "hasElement": true,
      "styleDesign": null,
      "createdBy": "real",
      "createdDate": 1494217733790,
      "modifiedBy": "superuser",
      "modifiedDate": 1494388952450,
      "rowVersion": "AAAAAAIC8ls="
   },
   {
      "styleId": 69,
      "styleName": "irtest",
      "dataSourceId": 1,
      "dataSourceName": null,
      "stationeryId": 16,
      "stationeryName": null,
      "styleType": 1,
      "styleTypeName": "Labels",
      "isActive": true,
      "isPlainPaper": false,
      "isSystemMaintained": false,
      "isPublished": true,
      "designerUrl": null,
      "sourceStyleId": 0,
      "rowIndicatorCode": 2,
      "isDefault": null,
      "hasElement": false,
      "styleDesign": null,
      "createdBy": "arun",
      "createdDate": 1493288218843,
      "modifiedBy": "real",
      "modifiedDate": 1494062410107,
      "rowVersion": "AAAAAAHZaDk="
   },
   {
      "styleId": 21,
      "styleName": "new style-copy",
      "dataSourceId": 1,
      "dataSourceName": null,
      "stationeryId": 5,
      "stationeryName": null,
      "styleType": 1,
      "styleTypeName": "Labels",
      "isActive": true,
      "isPlainPaper": false,
      "isSystemMaintained": false,
      "isPublished": true,
      "designerUrl": null,
      "sourceStyleId": 0,
      "rowIndicatorCode": 2,
      "isDefault": null,
      "hasElement": true,
      "styleDesign": null,
      "createdBy": "Nandita",
      "createdDate": 1493186162607,
      "modifiedBy": "Nandita",
      "modifiedDate": 1493186173807,
      "rowVersion": "AAAAAAEXEwI="
   },
   {
      "styleId": 97,
      "styleName": "style 1",
      "dataSourceId": 1,
      "dataSourceName": null,
      "stationeryId": 1,
      "stationeryName": null,
      "styleType": 1,
      "styleTypeName": "Labels",
      "isActive": true,
      "isPlainPaper": true,
      "isSystemMaintained": false,
      "isPublished": true,
      "designerUrl": null,
      "sourceStyleId": 0,
      "rowIndicatorCode": 2,
      "isDefault": null,
      "hasElement": true,
      "styleDesign": null,
      "createdBy": "real",
      "createdDate": 1494646737753,
      "modifiedBy": "real",
      "modifiedDate": 1494647127567,
      "rowVersion": "AAAAAAIxLKM="
   }
]

This is my sample json I am trying to sort this json by the field styleName like`

var result = _.sortBy(ctrl.styles, function (o) { return o.styleName; });

Result am getting is as follows

[
   {
      "styleId": 21,
      "styleName": "new style-copy",
      "dataSourceId": 1,
      "dataSourceName": null,
      "stationeryId": 5,
      "stationeryName": null,
      "styleType": 1,
      "styleTypeName": "Labels",
      "isActive": true,
      "isPlainPaper": false,
      "isSystemMaintained": false,
      "isPublished": true,
      "designerUrl": null,
      "sourceStyleId": 0,
      "rowIndicatorCode": 2,
      "isDefault": null,
      "hasElement": true,
      "styleDesign": null,
      "createdBy": "Nandita",
      "createdDate": 1493186162607,
      "modifiedBy": "Nandita",
      "modifiedDate": 1493186173807,
      "rowVersion": "AAAAAAEXEwI="
   },
   {
      "styleId": 69,
      "styleName": "irtest",
      "dataSourceId": 1,
      "dataSourceName": null,
      "stationeryId": 16,
      "stationeryName": null,
      "styleType": 1,
      "styleTypeName": "Labels",
      "isActive": true,
      "isPlainPaper": false,
      "isSystemMaintained": false,
      "isPublished": true,
      "designerUrl": null,
      "sourceStyleId": 0,
      "rowIndicatorCode": 2,
      "isDefault": null,
      "hasElement": false,
      "styleDesign": null,
      "createdBy": "arun",
      "createdDate": 1493288218843,
      "modifiedBy": "real",
      "modifiedDate": 1494062410107,
      "rowVersion": "AAAAAAHZaDk="
   },
   {
      "styleId": 91,
      "styleName": "Style Label",
      "dataSourceId": 1,
      "dataSourceName": null,
      "stationeryId": 1,
      "stationeryName": null,
      "styleType": 1,
      "styleTypeName": "Labels",
      "isActive": true,
      "isPlainPaper": true,
      "isSystemMaintained": false,
      "isPublished": true,
      "designerUrl": null,
      "sourceStyleId": 0,
      "rowIndicatorCode": 2,
      "isDefault": null,
      "hasElement": true,
      "styleDesign": null,
      "createdBy": "real",
      "createdDate": 1494217733790,
      "modifiedBy": "superuser",
      "modifiedDate": 1494388952450,
      "rowVersion": "AAAAAAIC8ls="
   },
   {
      "styleId": 97,
      "styleName": "style 1",
      "dataSourceId": 1,
      "dataSourceName": null,
      "stationeryId": 1,
      "stationeryName": null,
      "styleType": 1,
      "styleTypeName": "Labels",
      "isActive": true,
      "isPlainPaper": true,
      "isSystemMaintained": false,
      "isPublished": true,
      "designerUrl": null,
      "sourceStyleId": 0,
      "rowIndicatorCode": 2,
      "isDefault": null,
      "hasElement": true,
      "styleDesign": null,
      "createdBy": "real",
      "createdDate": 1494646737753,
      "modifiedBy": "real",
      "modifiedDate": 1494647127567,
      "rowVersion": "AAAAAAIxLKM="
   }
]

where ctrl.styles is the above JSON, Is there something am doing wrong?


Solution 1:

var result =  _.sortBy(ctrl.styles, function (a) { return a.styleName.toUpperCase(); });

The problem I was facing was the styleName where having different case, converting styleName to uppercase solved the problem. Yashar's answer also solved the issue

Solution 2:

With using this link and correcting return value, I found this works for me:(I suppresed array and named it as arr instead of ctrl.styles)

var res = _.sortBy(arr, function (a) {
    var x=  _.map(a.styleName.split(''), function (i) {
        return i.charCodeAt(0);
    }).join('');
    return x;
});

or as @ArunBabuVijayanath said in comments:

var res = _.sortBy(arr, function (a) {
    return a.styleName.toUpperCase();
});