3

I am trying to sort numeric string using sortbyorder function of lodash.

Function should work as normal on string only fields but should sort in numeric order in case of numeral string.

Sample array object is as follows:

[{
  "timeInProcessing": "20 min",
  "timeInManual": "8 min",
  "taskID": "653452",
  "reasonType": "Customer Request",
  "assignedStatus": "Robinson, Edwin",
  "virtualMachine": "[machine name]",
  "lastAction": "1st processing fail",
  "region": "EU",
  "project": "Demo Chue STAGE Media Extracts 04",
  "fileName": "Depósito à Prazo BC - BI de Abril a 08 JUN 2016.xlsx",
  "index": "1.0",
  "fileRoom": "NRP TriPost",
  "fileType": "xlsx",
  "fileSize": "22.49 MB",
  "processedBy": "n/a",
  "uploadedBy": "Johnson III, Chadwick",
  "node": "SPWD6PDGDS001"
}, {
  "timeInProcessing": "15 min",
  "timeInManual": "7 min",
  "taskID": "765435",
  "reasonType": "Multiple Attachments",
  "assignedStatus": "Robinson, Edwin",
  "virtualMachine": "[machine name]",
  "lastAction": "2nd processing fail",
  "region": "EU",
  "project": "Blue Thunder",
  "fileName": "lorem_ipsum_dolor.msg",
  "index": "1.1",
  "fileRoom": "North America",
  "fileType": "msg",
  "fileSize": "0.51 MB",
  "processedBy": "Chandwik, Eric",
  "uploadedBy": "Williamson, Lucinda",
  "node": "SPWD6PDGDS002"
}, {
  "timeInProcessing": "10 min",
  "timeInManual": "n/a",
  "taskID": "765436",
  "reasonType": "Customer Request",
  "assignedStatus": "Unassigned",
  "virtualMachine": "n/a",
  "lastAction": "[TBD]",
  "region": "AP",
  "project": "Hercules",
  "fileName": "lorem_ipsum_dolor.msg",
  "index": "1.1.1",
  "fileRoom": "STAGING-Enterprise HR",
  "fileType": "msg",
  "fileSize": "0.01 MB",
  "processedBy": "Holland, Roberta",
  "uploadedBy": "Trisko, Dora",
  "node": "SPWD6PDGDS005"
}, ]

the field on which I am trying to sort is timeInProcessing.

2 Answers 2

5

You may use a sort callback. It takes a key and returns either the numerical value or the original value, if the value would be NaN.

function byKey(key) {
    return function (o) {
        var v = parseInt(o[key], 10);
        return isNaN(v) ? o[key] : v;
    };
}

With lodash 4.17.2 _.sortBy:

function byKey(key) {
    return function (o) {
        var v = parseInt(o[key], 10);
        return isNaN(v) ? o[key] : v;
    };
}

var data = [{ timeInProcessing: "20 min", timeInManual: "8 min", taskID: "653452" }, { timeInProcessing: "15 min", timeInManual: "7 min", taskID: "765435" }, { timeInProcessing: "10 min", timeInManual: "n/a", "taskID": "765436" }, { timeInProcessing: "min", timeInManual: "n/a", "taskID": "7654XX" }, { timeInProcessing: "abc", timeInManual: "n/a", "taskID": "7654YY" }],
    sorted = _.sortBy(data, byKey('timeInProcessing'));

console.log(sorted);
_.reverse(sorted);
console.log(sorted);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

With lodash 3.10.1 _.sortByOrder:

function byKey(key) {
    return function (o) {
        var v = parseInt(o[key], 10);
        return isNaN(v) ? o[key] : v;
    };
}

var data = [{ timeInProcessing: "20 min", timeInManual: "8 min", taskID: "653452" }, { timeInProcessing: "15 min", timeInManual: "7 min", taskID: "765435" }, { timeInProcessing: "10 min", timeInManual: "n/a", "taskID": "765436" }, { timeInProcessing: "min", timeInManual: "n/a", "taskID": "7654XX" }, { timeInProcessing: "abc", timeInManual: "n/a", "taskID": "7654YY" }],
    sorted = _.sortByOrder(data, byKey('timeInProcessing'), ['asc']);

console.log(sorted);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>

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

7 Comments

can you give an example, how to use this callback in sortByOrder?
I need to specify the order as well
@SahilAgarwal for descending order use _.reverse
@SahilAgarwal an extension of Nina's sortByOrder approach. JSFiddle. Credits to Nina only.
@Nina, how can I pass another argument of field name by which sorting needs to be done to timeInProcessing function
|
0

I have added a property in your object sortKey. This is to hold numeric value for timeInProcessing. This will allow you to sort using numeric value.

Also in the following sample, I sorting using uploadedBy first and then parsed value to depict sorting on more than 1 key

var data=[{timeInProcessing:"20 min",timeInManual:"8 min",taskID:"653452",reasonType:"Customer Request",assignedStatus:"Robinson, Edwin",virtualMachine:"[machine name]",lastAction:"1st processing fail",region:"EU",project:"Demo Chue STAGE Media Extracts 04",fileName:"Depósito à Prazo BC - BI de Abril a 08 JUN 2016.xlsx",index:"1.0",fileRoom:"NRP TriPost",fileType:"xlsx",fileSize:"22.49 MB",processedBy:"n/a",uploadedBy:"Johnson III, Chadwick",node:"SPWD6PDGDS001"},{timeInProcessing:"15 min",timeInManual:"7 min",taskID:"765435",reasonType:"Multiple Attachments",assignedStatus:"Robinson, Edwin",virtualMachine:"[machine name]",lastAction:"2nd processing fail",region:"EU",project:"Blue Thunder",fileName:"lorem_ipsum_dolor.msg",index:"1.1",fileRoom:"North America",fileType:"msg",fileSize:"0.51 MB",processedBy:"Chandwik, Eric",uploadedBy:"Williamson, Lucinda",node:"SPWD6PDGDS002"},{timeInProcessing:"10 min",timeInManual:"n/a",taskID:"765436",reasonType:"Customer Request",assignedStatus:"Unassigned",virtualMachine:"n/a",lastAction:"[TBD]",region:"AP",project:"Hercules",fileName:"lorem_ipsum_dolor.msg",index:"1.1.1",fileRoom:"STAGING-Enterprise HR",fileType:"msg",fileSize:"0.01 MB",processedBy:"Holland, Roberta",uploadedBy:"Trisko, Dora",node:"SPWD6PDGDS005"}];

var sortedOrder = _.sortByOrder(_.map(data, function(o) {
  o["timeInProcessing_num"] = parseInt(o.timeInProcessing, 10);
  return o;
}), ["uploadedBy", "timeInProcessing_num"])
console.log(sortedOrder)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.0/lodash.min.js"></script>

2 Comments

just a hint, please use parseInt with base.
@NinaScholz Done. :-)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.