跳到主要内容

使用数组对象

检索数组

检索数组一般使用 for/in 循环实现,也可使用 for 循环,配合数组的 length 属性和下标来实现。

操作数组

使用数组的属性 length 也可以实现数组的增删,但是比较低效。

使用 delete 可以删除数组元素的值,但不改变数组的长度。

toString()将数组转换成一个字符串
toLocalString()将数组转换成局部字符串
join( )将数组元素连接起来以构成字符串,有可选参数,为分隔符
split()将字符串按照一定规则变化为数组

push() 和 pop()

let a = []; // 定义数组
a.push(1);
// 进栈,栈值为 [1] ,此时该方法返回 1
a.pop(); // 出栈,栈值为空,此时该方法返回 1
a.push(2); // 进栈,栈值为 [2] ,此时该方法返回 1
a.pop(); // 出栈,栈值为空,此时该方法返回 2 \
a.push(3, 4); // 进栈,栈值为 [3,4],此时该方法返回 2
a.pop();
// 出栈,栈值为 [3],此时该方法返回 4
a.pop(); // 出栈,栈值为空,此时该方法返回 3

方法 push() 是按照参数的顺序依次添加数组到尾部,所以它在原数组进行操作。方法 pop(),用于删除数组的最后一个元素,如果数组为空,则 pop() 不改变数组的长度,返回 undefined 。

shift() 和 unshift()

方法 unshift() 是按照参数的顺序依次添加数组到头部,所以它在原数组进行操作。方法 shift(),用于删除数组的头部元素,如果数组为空,则 shift() 不改变数组的长度,返回 undefined 。

concat()

concat() 是比较特殊的数组元素添加方法。它采用粘连的方式把参数添加到数组中,而不是模拟堆栈的方式。

concat() 返回一个新的数组,而不是原数组。

如果参数是数组,则 concat() 把其打散分别作为单独的元素连接到数组的尾部。但,不会打散数组中包含的数组。

操作子数组

通过模拟堆栈数据结构的操作方式来实现对数组的操作,它有着严格的次序约定。对于这种严谨的一维线性作业方式,常称之为线性表。

splice()

splice() 在原数组上进行插入、删除、替换数组元素操作。

  • 第一个参数为操作的下标位置

  • 第二个参数为删除个数

  • 第三个之后参数为要插入的元素

  • 参数可选,若只有一个参数,则删除指定元素后(包括该元素)所有元素

  • splice ()的删除和插入是同时进行的

  • splice ()返回值为删除的子数组

  • 当第一个参数大于 length ,删除无效,直接添加新的元素

  • 如果第一个参数是负值,则按绝对值从数组右侧向左开始定位

slice()

slice() 和 splice() 方法功能相似,但它进能够截取数组中指定的区域的元素,并返回这个子元素。

  • 第一个参数为起始下标
  • 第二个参数为结束位置
  • 参数为负时,则为倒序定位
  • 起始值大于 length 时,不执行任何操作,返回空数组
  • slice ()返回数组一部分,而不改变原数组

如果不想改动原数组,使用 slice() 是个不错的选择。若是其它要求, splice() 也不错呦。

数组排序

reverse()

reserve() 能够颠倒数组元素的顺序,该方法不需要参数。该方法是在原数组的基础上进行操作,不产生新数组。

sort() 对数组进行排序

  • 若无参数,则字母排序
  • 若元素不是字符串,则先转换为字符串
  • 在排序时, sort() 方法将根据元素值进行逐位分析,而不是根据字符串的个数进行比较
  • 任何情况,数组中的 undefined 的元素都会排到最后
  • sort ()也是在原数组操作,不产生新的数组
function f(a, b) {
return a - b;
}
var a = [3, 1, 2, 4, 5, 7, 8, 0, 9];
a.sort(f);
alert(a);
//返回数组 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

sort ()方法不仅仅可以按字母进行排序,还可以及进行其它的操作。这时,就必须提供一个函数参数,该函数参数比较两个值的相对顺序。排序函数应有两个参数,返回值如下。

  • 如果根据自身判断, a 小于 b ,则排序后 a 应该在 b 的前,返回一个小于 0 的值

  • 如果 a 等于 b ,则返回 0

  • 如果 a 大于 b ,则返回 一个大于 0 的数

    使用排序函数

sort()方法可以对数组进行排序,在执行过程中并不会创建新的 Array 对象。其语法格式如下:

oArray.sort();
oArray.sort(sortFunction);

参数 sortFunction 是可选的,是用来确定数组中各元素顺序的函数的名称。如果该参数被省略,那么元素将按照 ASCII 字符顺序进行升序排列,这意味着不能对中文进行排序。

默认情况下的排序规则

默认情况下,数组将按下面的方法进行排序:

  • 排序区分大小写,大写优先于小写(例如 Z 优先于 a )
  • 按升序排序(例如 a 优先于 b )
  • 数组被修改以反映排序,排序后的数组中如果存在相同索引字段的元素,那么这些元素将连续地排在一起(索引号连续),但它们之间没有什么特定的顺序
  • 数值字段按字符串方式进行排序,因此100优先于99,因为1的字符串值比9的低

自定义排序

如果定义参数 sortFunction 指定了一个函数,那么该函数必须返回下列值之一:

  • -1,表示所传递的第一个参数比第二个参数小
  • 0,表示两个参数相等
  • 1,表示第一个参数比第二个参数大

排序的范例。

例如下面的代码分别演示了怎样进行数组排序:

var oArray = new Array('Tom', 'Tommy', 'John'); // 按照 ASCII 字符顺序进行升序排列
oArray.sort(); // ['John', 'Tom', 'Tommy'];
console.log(oArray);
var sortFn = function (a, b) {
if (a.length < b.length) return -1;
if (a.length > b.length) return 1;
if (a.length == b.length) return 0;
}; // 按照自定义函数进行排序,自定义函数是根据元素字符串长度进行对比的
oArray.sort(sortFn); // ["Tom","John","Tommy"]
console.log(oArray);

下面的代码演示了如何对二维数组进行自定义排序:

var ads = new Array(
['pic/image1.jpg', 20],
['pic/image4.jpg', 10],
['pic/image2.jpg', 20],
['pic/image3.jpg', 40],
); //根据二位数组中的数值来重新排列数组元素,数值越大,越位于后面
var sortFn = function (a, b) {
if (a[1] < b[1]) return -1;
if (a[1] > b[1]) return 1;
if (a[1] == b[1]) return 0;
};
ads.sort(sortFn);
console.log(ads);

实现中文按 Unicode 代码点排序

例如下面的代码演示了怎样对由中文元素组成的数组进行排序:

var oArray = new Array('华康圆体', '黑体', '华康黑体', '宋体');
var sortFn = function (u, v) {
var a = String(u);
var b = String(v);
if (a.charCodeAt(0) < b.charCodeAt(0)) return -1;
if (a.charCodeAt(0) > b.charCodeAt(0)) return 1;
if (a.charCodeAt(0) == b.charCodeAt(0)) return 0;
};
// 按照自定义函数进行排序
// 自定义函数是根据元素第一个字符的 Unicode 代码点进行对比的
oArray.sort(sortFn); // ["$1康圆体","华康黑体","宋体","黑体"]
console.log(oArray);

数组与字符串的转换

push()给数组添加元素返回值为 length
pop()删除并返回数组最后一个元素返回值为删除的元素
unshift()在头部添加一个元素返回值为 length
shift()将元素移除数组返回值为删除的元素
concat()连接数组返回新的数组

toString()

toString() 方法是 Object() 对象定义的,因此在 JavaScript 中所有对象都继承了这个方法,数组对象不例外。在数组中 toString() 方法能够将每个元素转换为字符串,然后以逗号连续输出显示。

var a = [1, 2, 3, 4, 5];
var s = a.toString();
alert(s); // 返回字符串 "1,2,3,4,5"

toLocalString()

toLocalString() 方法与 toString() 方法用法基本相同,主要区别在于 toLocalString() 方法能够使用用户所在地特定的分隔符把生成的字符串连接起来,形成一个字符串。

var a = [1, 2, 3, 4, 5];
var s = a.toLocalString();
alert(s);
// 返回字符串 "1.00, 2.00, 3.00, 4.00, 5.00"

join()

var a = [1, 2, 3, 5, 5, 4];
var s = a.join('==');
alert(s); // "1==2==3==5==5==4"