【问题标题】:how to sort array which contains numbers? [duplicate]如何对包含数字的数组进行排序? [复制]
【发布时间】:2017-12-19 09:34:07
【问题描述】:

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

前-

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

但仍然没有运气。谁能指出这里有什么问题?

【问题讨论】:

    标签: javascript arrays sorting


    【解决方案1】:

    为什么它不起作用?

    您正在对字符串进行排序,默认排序为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);

    【讨论】:

    • 工作起来很有魅力的男人。而且我缺少localeCompare 参数。感谢您的帮助:)
    • localesoptions 参数需要现代浏览器。
    • 如何将日期/时间作为字符串进行比较,例如:13_08_2018_2115(八月的时间)和26_07_2018_1633(七月的时间)。对于降序视图,我使用的是reviews.sort(function(a, b) { return b.date.localeCompare(a.date, undefined, { numeric: true }) }),但 7 月条目在 8 月条目之前。
    • 您可以将数据转换为符合ISO 8601 的字符串并像字符串一样进行比较。
    • 谢谢@NinaScholz,我最终改变了我的应用程序的约定(为了更好)并像new Date().toISOString()这样在MongoDB中存储日期/时间,然后值上的标准localeCompare按需要工作.然后我在显示时使用很棒的date-fns进行格式化:date-fns.org/v1.29.0/docs/format
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您的数据集有问题。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多