使用Underscore排序

时间:2016-03-17 10:06:54

标签: javascript underscore.js

我正在尝试使用下划线_.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位于顶部。从某种意义上说,我希望排序忽略以_

开头的字符串

6 个答案:

答案 0 :(得分:2)

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>');
&#13;
&#13;
&#13;

答案 1 :(得分:1)

试试这段代码。

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>

您可以通过向其他名称添加下划线来查看小提琴,看看它是如何排序的。

答案 2 :(得分:0)

你可以做到

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

请参阅小提琴https://jsfiddle.net/s7r2kxhq/3/

答案 3 :(得分:0)

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

&#13;
&#13;
(?<=[^\d])\.
 -------- --
     ^    ^
     |    |
     |    ------------------  Escape the `.` so we're working with a literal
     |                          dot rather than "any character"
     |
     -----------------------  Look for any preceding non-digit character
                                but don't include it in the replace group
&#13;
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));
&#13;
&#13;
&#13;

答案 4 :(得分:-1)

执行此操作的一种可能性是将_.sortBy中的iteratee更新为以下内容

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

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

之后的值中排序

答案 5 :(得分:-2)

使用Array.prototype.sort并测试名称是否包含&#34; _&#34;

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

你的js对象有点乱,为什么你的对象周围有一个数组呢?