我正在尝试使用下划线_.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位于顶部。从某种意义上说,我希望排序忽略以_
开头的字符串答案 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;
答案 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');
});
答案 3 :(得分:0)
您可以通过将字符串转换为小写来实现此目的:
(?<=[^\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;
答案 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对象有点乱,为什么你的对象周围有一个数组呢?