admin管理员组

文章数量:1387397

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.

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.

Share Improve this question edited Jan 12, 2017 at 7:15 Rajesh 25k5 gold badges50 silver badges83 bronze badges asked Jan 12, 2017 at 7:12 Sahil AgarwalSahil Agarwal 9094 gold badges13 silver badges20 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 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./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./ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>

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./ajax/libs/lodash.js/3.10.0/lodash.min.js"></script>

本文标签: javascriptsort by numeric string using sortByOrder lodashStack Overflow