导航
×
   ❮   
HTML CSS JavaScript PHP Go ECMS

JavaScript 教程

JS 简介 JS 如何使用 JS 输出 JS 语法 JS 语句 JS 注释 JS 变量 JS 运算符 JS 条件语句 JS 循环 JS 字符串 JS 数字 JS 函数 JS 对象 JS 日期 JS 数组 JS 类型化数组 JS 集合 JS Map 映射 JS Math JS 正则表达式 JS 数据类型 JS 错误 JS 事件 JS 编程 JS 关键字参考 JS 保留关键字参考 JS 运算符参考 JS 运算符优先级 JS UTF-8 字符 JS UTF-8 符号 JS UTF-8 表情符号 JS 版本

JavaScript 数组排序


数组排序

sort() 方法以字母顺序对数组进行排序:

实例

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();        // 对水果的元素进行排序
亲自试一试 »

反转数组

reverse() 方法反转数组中的元素。

您可以使用它以降序对数组进行排序:

实例

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();       // 先对水果的元素进行排序 
fruits.reverse();     // 然后颠倒元素的顺序
亲自试一试 »

数字排序

默认地,sort() 函数按照字符串顺序对值进行排序。

该函数很适合字符串("Apple" 会排在 "Banana" 之前)。

不过,如果数字按照字符串来排序,则 "25" 大于 "100",因为 "2" 大于 "1"。

正因如此,sort() 方法在对数值排序时会产生不正确的结果。

我们通过一个比值函数来修正此问题:

实例

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});
亲自试一试 »

使用相同的技巧对数组进行降序排序:

实例

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});
亲自试一试 »

比值函数

比较函数的目的是定义另一种排序顺序。

比较函数应该返回一个负,零或正值,这取决于参数:

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

sort() 函数比较两个值时,会将值发送到比较函数,并根据所返回的值(负、零或正值)对这些值进行排序。

如果结果为负,则 a 排序在 b 之前。

如果结果为正,则 b 排序在 a 之前。

如果结果为 0,则不会更改这两个值的排序顺序。

实例:

compare 函数比较数组中的所有值,一次比较两个值 (a, b).

当比较 40 和 100 时,sort() 方法会调用比较函数 function(40,100)。

该函数计算 40-100 (a - b) ,然后返回 -60(负值)。

排序函数将把 40 排序为比 100 更低的值。

您可以使用下面的代码片段来测试数值和字母排序:

<button onclick="myFunction1()">Sort Alphabetically</button>
<button  onclick="myFunction2()">Sort Numerically</button>

<p id="demo"></p>
 
<script>
var points = [40, 100, 1, 5, 25, 10];
 document.getElementById("demo").innerHTML = points;

function  myFunction1() {
  points.sort();
  document.getElementById("demo").innerHTML  = points;
}

function myFunction2() {
  points.sort(function(a, b){return  a - b});
  document.getElementById("demo").innerHTML = points;
}
</script>
亲自试一试 »

以随机顺序排序数组

实例

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return 0.5 - Math.random()});

亲自试一试 »


Fisher Yates 方法(洗牌算法)

上面的例子 array.sort() 并不准确,它更偏爱一些数字。

最流行的正确方法叫做 Fisher Yates shuffle,在 1938 年就被引入科学计算!

在 JavaScript 中,该方法可以转换为:

实例

var points = [40, 100, 1, 5, 25, 10];

for (i = points.length -1; i > 0;   i--) {
  j = Math.floor(Math.random() * i)
  k = points[i]
    points[i] = points[j]
  points[j] = k
}

亲自试一试 »


查找最高(或最低)数组值

没有用于在数组中查找最大值或最小值的内置函数。

但是,在对数组排序后,可以使用索引来获取最高值和最低值。

升序排序:

实例

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});
// 现在 points[0] 包含最小值
// 并且 points[points.length-1] 包含最大值
亲自试一试 »

降序排序:

实例

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});
// 现在 points[0] 包含最高值
// 并且 points[points.length-1] 包含最小值
亲自试一试 »

如果只想找到最高(或最低)值,对整个数组进行排序是一种非常低效的方法。


对数组使用 Math.max()

您可以使用 Math.max.apply 来查找数组中的最高值:

实例

function myArrayMax(arr) {
    return Math.max.apply(null, arr);
}

亲自试一试 »

Math.max.apply([1, 2, 3]) 等于 Math.max(1, 2, 3)


对数组使用 Math.min()

您可以使用 Math.min.apply 来查找数组中的最低值:

实例

function myArrayMin(arr) {
  return Math.min.apply(null, arr);
}

亲自试一试 »

Math.min.apply([1, 2, 3]) 等于 Math.min(1, 2, 3)


我的 Min / Max JavaScript 方法

最快的解决方法是使用"自制"方法。

此函数遍历数组,用找到的最高值与每个值进行比较:

实例 (Find Max)

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

亲自试一试 »

此函数遍历数组,用找到的最低值与每个值进行比较:

实例 (Find Min)

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

亲自试一试 »


排序对象数组

JavaScript 数组经常会包含对象:

实例

var cars = [
   {type:"Volvo", year:2016},
   {type:"Saab", year:2001},
   {type:"BMW", year:2010}
];

即使对象拥有不同数据类型的属性,sort() 方法仍可用于对数组进行排序。

解决方法是通过比较函数来对比属性值:

实例

 cars.sort(function(a, b){return a.year - b.year});
亲自试一试 »

比较字符串属性会稍复杂:

实例

  cars.sort(function(a, b){
  var x = a.type.toLowerCase();
  var y = b.type.toLowerCase();
    if (x< y) {return -1;}
   if (x > y) {return 1;}
  return 0;
});
亲自试一试 »

freew3c.com 中文网是独立运营的中文开发者学习平台,与 freew3c.com 无关联。提供的内容仅用于学习和测试,不保证内容的正确性。


Copyright @2020-2026 京ICP备888888号-8