如何排序包含数字的数组?

时间:2017-12-19 09:34:08

标签: javascript arrays sorting

我正在尝试对数组进行排序。

实施例 -

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

但仍然没有运气。任何人都可以指出这里有什么不对吗?

3 个答案:

答案 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)

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

答案 2 :(得分:1)

您的数据集存在问题。

您正在根据标签值进行排序,该值是一个字符串。字符串始终按字典顺序排序。 如果您希望“名称3”出现在“名称10”之前,您可以使用“名称03”或更好地添加另一个将用于排序的数字属性,例如。

{label: "Name 3", order: 3}