问题
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