我正在尝试对数组进行排序。
实施例 -
let arr = [{label: "Name 5"}, {label: "Name 3"},{label: "Name 12"}, {label: "Name 10"}, {label: "First Name 5"}, {label: "Apple"}, {label: "Orange"}, {label: "water"}];
let sortedArray = arr.sort(function(a, b){
return a.label.localeCompare(b.label);
});
console.log(sortedArray);
当我尝试对它进行排序时,“名称10”首先出现,但“名称3”应该出现。
我也试过这个 -
let sortedArray = arr.sort(function(a, b){
var nameA=a.label.toLowerCase(), nameB=b.label.toLowerCase();
if (nameA < nameB){
return -1;
} //sort string ascending
if (nameA > nameB){
return 1;
}
return 0; //no sorting
});
而这 -
Array.prototype.reverse()
String.prototype.localeCompare()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
但仍然没有运气。任何人都可以指出这里有什么不对吗?
答案 0 :(得分:8)
您正在排序字符串,默认排序为lexicographical order。您正在寻找的是按自然顺序排序。
您可以使用String#localeCompare
的选项进行自然排序。
let arr = [{label: "Name 5"}, {label: "Name 3"},{label: "Name 12"}, {label: "Name 10"}, {label: "First Name 5"}, {label: "Apple"}, {label: "Orange"}, {label: "water"}];
arr.sort(function(a, b) {
return a.label.localeCompare(b.label, undefined, { numeric: true, sensitivity: 'base' });
});
console.log(arr);
答案 1 :(得分:1)
let arr = [{label: "Name 5"}, {label: "Name 3"},{label: "Name 12"}, {label: "Name 10"}, {label: "First Name 5"}, {label: "Apple"}, {label: "Orange"}, {label: "water"}];
arr.sort(function(a, b) {
var nameA = a.label.toUpperCase(); // ignore upper and lowercase
var nameB = b.label.toUpperCase(); // ignore upper and lowercase
if (nameA < nameB) {
return -1;
}
if (nameA > nameB) {
return 1;
}
// names must be equal
return 0;
});
console.log(arr);
&#13;
答案 2 :(得分:1)
您的数据集存在问题。
您正在根据标签值进行排序,该值是一个字符串。字符串始终按字典顺序排序。 如果您希望“名称3”出现在“名称10”之前,您可以使用“名称03”或更好地添加另一个将用于排序的数字属性,例如。
{label: "Name 3", order: 3}