使用下划线排序

sortby using Underscore

我正在尝试使用下划线 _.sortby() 函数对某些记录进行排序。我的要求是对以 _ 开头的名称给予更高的优先级。例如。如果我的代码是

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;
});

我希望记录 _A,roomNumber: 2, bedNumber: 1 位于顶部。从某种意义上说,我希望排序忽略以 _

开头的字符串

这样做的一种可能性是将 _.sortBy 中的迭代对象更新为如下内容

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

此函数将在开头附加一个代码值高于 _ 的字符,这意味着其他所有内容都将排在带有 _

的值之后

你可以做到

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

见fiddlehttps://jsfiddle.net/s7r2kxhq/3/

使用 Array.prototype.sort 并测试名称是否有“_”

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

而且你的js对象有点奇怪,为什么你的对象周围有一个数组?

试试这个代码。

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>

您可以通过在其他名称中添加下划线来尝试 fiddle 并查看其排序方式。

String#localeCompare_ 排序到顶部(无论如何)。

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>');

您可以通过将字符串转换为小写来实现此目的:

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>