JavaScript 数组排序及查找数组中最大值最小值方法

  • Post author:
  • Post category:java




1. sort()方法排序



1.1 方法介绍


sort()

方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的。

由于它取决于具体实现,因此无法保证排序的时间和空间复杂性。



1.2 语法:arr.sort([compareFunction])



1.3 参数说明


  • compareFunction

    可选,用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的各个字符的Unicode位点进行排序。


    • firstEl

      ,第一个用于比较的元素。

    • secondEl

      ,第二个用于比较的元素。



1.4 返回值: 排序后的数组。


注意:

数组已原地排序,即会改变原数组,并且不进行复制。



1.5 方法描述


如果没有指明 compareFunction

,那么元素会按照转换为的字符串的诸个字符的Unicode位点进行排序。

例如 “Banana” 会被排列到 “cherry” 之前。当数字按由小到大排序时,9 出现在 80 之前,但因为(没有指明 compareFunction),比较的数字会先被转换为字符串,所以在Unicode顺序上 “80” 要比 “9” 要靠前。


如果指明了 compareFunction

,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:

  • 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;
  • 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);
  • 如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。
  • compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

所以,比较函数格式如下:

function compare(a, b) {
  if (a < b ) {           // 按某种排序标准进行比较, a 小于 b
    return -1;
  }
  if (a > b ) {
    return 1;
  }
  // a must be equal to b
  return 0;
}

要比较数字而非字符串,比较函数可以简单的以 a 减 b,如下的函数将会将数组

升序

排列:

function compareNumbers(a, b) {
  return a - b;
}

sort 方法可以使用

函数表达式

方便地书写:

var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
  return a - b;
});
console.log(numbers);
// 控制台输出:[1, 2, 3, 4, 5]

对象可以按照某个属性排序:

var items = [
  { name: 'Edward', value: 21 },
  { name: 'Sharpe', value: 37 },
  { name: 'And', value: 45 },
  { name: 'The', value: -12 },
  { name: 'Magnetic' },
  { name: 'Zeros', value: 37 }
];

// sort by value 对数值进行排序
items.sort(function (a, b) {
  a.value = a.value ? a.value : 0;
  b.value = b.value ? b.value : 0;
  return (a.value - b.value)
});

// sort by name 对字符串进行排序
items.sort(function(a, b) {
  var nameA = a.name.toUpperCase(); // ignore upper and lowercase
  var nameB = b.name.toUpperCase(); // ignore upper and lowercase
  if (nameA < nameB) {
    return -1;
  }
  if (nameA > nameB) {
    return 1;
  }
  // names must be equal
  return 0;
});


注意:

对象按照某个属性进行排序时,需要对该属性是否存在进行判断,若该属性不存在,则需要在其所在的对象上添加该属性并为其设定默认的属性值,否则在排序时,不存在该属性的对象之后的数据不会参与排序操作。

参考文档:


MDN Array.prototype.sort()




2. 最大值/最小值方法



2.1 查找数组中的最大值



2.1.1 Math.max.apply()方法



语法:Math.max.apply(null, arr)


参数说明:
  • 第一个参数传

    null

    ,因为没有对象来调用它。
  • 第二个参数传一个数组。

apply()方法可以将数组转换成参数列表。

第二个参数必须是由能转换成number类型的数值组成的数组。



2.1.2 自定义算法

function searchArrayMax(arr) {
    var len = arr.length
    var max = arr[0];
    while (len--) {
        if (arr[len] > max) {
            max = arr[len];
        }
    }
    return max;
}



2.2 查找数组中的最小值



2.2.1 Math.min.apply()方法



语法:Math.min.apply(null, arr)


参数说明:
  • 第一个参数传

    null

    ,因为没有对象来调用它。
  • 第二个参数传一个数组。

apply()方法可以将数组转换成参数列表。

第二个参数必须是由能转换成number类型的数值组成的数组。



2.2.2 自定义方法

function myArrayMin(arr) {
    var len = arr.length
    var min = arr[0];
    while (len--) {
        if (arr[len] < min) {
            min = arr[len];
        }
    }
    return min;
}


—— END ——



版权声明:本文为pro_fan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。