简体   繁体   English

使用_.sortByOrder lodash按数字字符串排序

[英]sort by numeric string using _.sortByOrder lodash

I am trying to sort numeric string using sortbyorder function of lodash . 我试图使用排序数字字符串 sortbyorder的功能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 . 我尝试排序的字段是timeInProcessing

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 . 如果值为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 : 使用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 : 使用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> 

I have added a property in your object sortKey . 我已经在您的对象sortKey添加了一个属性。 This is to hold numeric value for timeInProcessing . 这是为了保存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 同样在以下示例中,我首先使用uploadedBy排序,然后使用解析后的值来描述多个键上的排序

 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> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM