如何对包含数字的数组进行排序?

4
我将尝试对一个数组进行排序。
例如:

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

当我试图对其进行排序时,“Name 10”排在第一位,但“Name 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
});

And this -

Array.prototype.reverse()
String.prototype.localeCompare()

但是仍然没有运气。有人能指出这里的问题吗?
请参考:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

3个回答

11

为什么它不起作用?

你正在排序字符串,而默认排序是字典序排列。你需要的是自然排序。

解决方案

你可以使用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
这个人干的太棒了,就像魔法一样。我错过了 localeCompare 的参数。谢谢你的帮助 :) - Joomler
1
localesoptions参数需要现代浏览器。 - Salman A
1
你可以将数据转换为符合ISO 8601标准的字符串,并像比较字符串一样进行比较。 - Nina Scholz
感谢@NinaScholz,我最终改变了我的应用程序约定(更好地)并像这样在MongoDB中存储日期/时间new Date().toISOString(),然后对该值使用标准的localeCompare即可按预期工作。然后,在显示时使用神奇的date-fns进行格式化:https://date-fns.org/v1.29.0/docs/format。 - user1063287
我刚刚运行了代码片段,“Name 12”明显在“Name 3”之后。 - Sync
显示剩余2条评论

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


1

您的数据集存在问题。

您正在基于标签值进行排序,而标签值是一个字符串。字符串总是按字典顺序排序。 如果您想让"Name 3"在"Name 10"之前出现,可以使用"Name 03",或者更好地添加另一个数字属性用于排序,例如:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接