sortby using Underscore

痴心易碎 提交于 2019-12-25 07:03:55

问题


I am trying to sort certain records using underscore _.sortby() function . My requirement is to give higher priority for names starting with _ . For eg . if my code is

var patients = [
    [{name: 'John', roomNumber: 1, bedNumber: 1}],
    [{name: 'Lisa', roomNumber: 1, bedNumber: 2}],
    [{name: '_A', roomNumber: 2, bedNumber: 1}],
    [{name: 'Omar', roomNumber: 3, bedNumber: 1}]
];
var sortedArray = _.sortBy(patients, function(patient) {
    return patient[0].name;
});

I would want to have the record _A, roomNumber: 2, bedNumber: 1 to be on the top . In a sense I want the sort to ignore the strings starting with _


回答1:


Try this code.

var patients = [
    [{name: '_John', roomNumber: 1, bedNumber: 1}],
    [{name: 'Lisa', roomNumber: 1, bedNumber: 2}],
    [{name: '_A', roomNumber: 2, bedNumber: 1}],
    [{name: 'Amar', roomNumber: 3, bedNumber: 1}]
];

var sortedByChar = _.sortBy(patients, function(patient) {
  
  return (patient[0].name.indexOf('_') != 0) ? patient[0].name[0] : patient[0].name[1];
  
});

var finalArray = _.sortBy(sortedByChar, function(patient) {
  return (patient[0].name.indexOf('_') != 0); 
});

alert(JSON.stringify(finalArray));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

You can play around with the fiddle by adding underscores to other names and see how it sorts.




回答2:


String#localeCompare sorts _ to top (at any case).

var patients = [[{ name: 'John', roomNumber: 1, bedNumber: 1 }], [{ name: 'Lisa', roomNumber: 1, bedNumber: 2 }], [{ name: 'a', roomNumber: 2, bedNumber: 1 }], [{ name: 'A', roomNumber: 2, bedNumber: 1 }], [{ name: '_A', roomNumber: 2, bedNumber: 1 }], [{ name: 'Omar', roomNumber: 3, bedNumber: 1 }], [{ name: '_Omar', roomNumber: 3, bedNumber: 1 }]],
sortedArray = patients.sort( function (a,b) {
    return a[0].name.localeCompare(b[0].name);
});

document.write('<pre>' + JSON.stringify(sortedArray, 0, 4) + '</pre>');



回答3:


You can do

var sortedArray = _.sortBy(patients, function(patient) {
    return patient[0].name.replace('_', '0');
});

See fiddle https://jsfiddle.net/s7r2kxhq/3/




回答4:


You can achieve this by converting the string to lowercase:

var patients = [ [{name: 'John', roomNumber: 1, bedNumber: 1}], [{name: 'Lisa', roomNumber: 1, bedNumber: 2}], [{name: '_A', roomNumber: 2, bedNumber: 1}], [{name: 'Omar', roomNumber: 3, bedNumber: 1}] ];

var sortedArray = _.sortBy(patients, function(patient) {
    return patient[0].name.toLowerCase();
});

document.write(JSON.stringify(sortedArray));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>



回答5:


One of the possibilities of doing this is updating the iteratee in the _.sortBy to something like following

function(value){
    if(value[name].substr(1) != '_') {
        return "z" + value[name];   
    } 
    return value[name];
}

This function will append to the beginning a character which code value is higher than _, meaning that everything else will be ordered after the values with _




回答6:


Use Array.prototype.sort and test if the name has an "_"

var sortedArray = patients.sort(function(a, b) {
    if (/^_/.test(a[0].name)) {
        return -1;
    }
    return a[0].name < b[0].name ? -1 : 1;
});

And your js object is a little fucked up, why do you have an array around your object ?



来源:https://stackoverflow.com/questions/36057313/sortby-using-underscore

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!