2、Array

作者: 示十 | 来源:发表于2019-07-22 20:15 被阅读0次

MDN官方文档

数组声明方式

1、Array构造函数

new Array(); // 声明一个空数组  undefined
new Array(3); // 声明包含3项的数组 undefined,undefined,undefined
new Array('hello', 'world');

new 关键字可省略

Array(3)

2、数组字面量
比较常用的方法,使用这种方式不会调用Array的构造函数(和调用构函数会有什么区别呢???)

var arr = [];
var colors= ['red', 'green', 'blue'];

由于不同浏览器表现不同,尽量不要在数组中出现空位

var arr = ['red', , ];  // 强烈不建议这种语法

数组的访问方式

var colors= ['red', 'green', 'blue'];
colors[0]; // red

数组长度 length

console.log(colors.length); // 3

清空数组

arr.length = 0;
// 或者
arr = [];

检测数组

该方法并不能准确检测数组,待改善
Array.isArray(val);

支持的浏览器:IE9+、 Firefox 4+、Safari 5+、 Opera 10.5+、Chrome

if(Array.isArray(val);){
  //  执行操作
}

转换方法

1、toLocaleString()
调用数组每一项的toLocaleString方法,和toString方法返回值一样
返回值:数组中每项以逗号分割的字符串

var colors= ['red', 'green', 'blue'];
console.log(colors.toLocaleString()); // red,green,blue

2、toString()
调用数组每一项的toString方法
返回值:数组中每项以逗号分割的字符串

var colors= ['red', 'green', 'blue'];
console.log(colors.toString()); // red,green,blue

3、valueOf()
返回值:返回原数组

var colors= ['red', 'green', 'blue'];
console.log(colors.valueOf()); // red,green,blue

4、join(param)
参数:param:用作分隔符的字符串,默认值为,
返回值:包含所有数组项的字符串

var arr = [1,2,3,4,5];
console.log(arr.join()); //1,2,3,4,5
console.log(arr.join('==')); // 1==2==3==4==5

如果数组中某一项是null或者undefined,那么该值在以上方法中返回结果以空字符串表示

栈、队列方法

1、push
参数:可选,可接收任意类型、任意数量的参数
将参数添加到数组末尾
返回值:数组修改后的长度
是否改变原数组:是

var arr = [1,2,3,4,5];
arr.push({name:12});
push

2、pop
返回值:返回数组的最后一项
是否改变原数组:是

arr.pop(); // 5
console.log(arr); // [1, 2, 3, 4]

3、shift
返回值:移除数组中第一项并返回该项
是否改变原数组:是

arr.shift(); // 5
console.log(arr); // [ 2, 3, 4, 5]

与pop相反
4、 unshift
参数:可选,可接收任意类型、任意数量的参数
将参数添加到数组头部
返回值:数组修改后的长度
是否改变原数组:是
与push相反

重排序方法

5、reverse
参数:无
返回值:返回翻转数组项顺序后的新数组
是否改变原数组:是

var arr = [1,2,3,4,5];
arr.reverse(); //[5, 4, 3, 2, 1]

6、sort
参数:可选,排序函数
返回值:返回排序后的新数组
是否改变原数组:是
sort 方法默认是升序排序,即最小的在最前面,最大的在最后面
在调用此方法时会调用每项的toString方法,然后比较得到的字符串再进行确定如何排序
这样就可能出现问题:

var arr = [1,2,3,4,5,10];
arr = arr.sort()
console.log(arr); // [1, 10, 2, 3, 4, 5]

这时就需要传入一个比较函数来确定排序顺序
比较函数需要两个参数:
如果a-b>0,a将排在b之后
如果a-b=0,a,b按照原顺序排列
如果a-b<0,a将排在b之前

// 比较函数(适用于大多数数据类型)
function compare(a, b) {
   // return a - b; // 只适用于数组项为数值的数组
   if (a < b) {
     return -1;
   } else if (a > b) {
     return 1;
  } else {
     return 0;
  }
}
var arr = [1, 2, 3, 4, 5, 10];
arr = arr.sort(compare);
console.log(arr); // [1, 2, 3, 4, 5, 10]
var arr = ["a", "d", "b", "e", "c"];
arr = arr.sort(compare);
console.log(arr); // ["a", "b", "c", "d", "e"]

操作方法

7、concat
参数:可选,可以是一个元素、一维数组、二维数组、对象等
返回值:将参数添加到原数组末尾后返回改变后的数组
是否改变原数组:否
如果参数为空,则返回当前数组副本,即复制原数组
如果参数不是数组,这些值只会简单添加到原数组末尾,例如:


concat
var arr = [1, 2, 3];
console.log(arr.concat(4,[5,6,7],[[8,9],[10,11]])); //[1, 2, 3, 4, 5, 6, 7, Array(2), Array(2)]
console.log(arr); //[1, 2, 3]

所以,如果用concat合并多维数组元素时显然是不靠谱的(解决办法???自己重写函数)
8、slice
参数:可选,接受一或两个参数,即起始位置、结束位置
返回值:根据参数返回截取原数组项得到的新数组
是否改变原数组:否
如果参数为空,返回原数组的副本
如果一个参数,返回从起始位置到原数组末尾所有项组成的新数组
如果两个参数,返回从起始位置到结束位置(不包括结束位置)所有项组成的新数组
如果起始位置大于结束位置,返回空数组

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(arr.slice()); // [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(arr.slice(0)); // [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(arr.slice(2)); // [3, 4, 5, 6, 7, 8, 9];
console.log(arr.slice(2, 5)); // [3, 4, 5];

如果参数为负值,则用数组长度与该值相加确定相应位置:

console.log(arr.slice(-5,-1)); // 相当于 arr.slice(4, 8) 返回 [5, 6, 7, 8]

9、splice
参数:可选,接受1~n个参数,即起始位置、结束位置、要删除的项数和要插入的任意数量的项
返回值:根据参数返回截取原数组项得到的新数组
是否改变原数组:是

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];

(1)如果不传入任何参数,返回空数组
(2)删除:
如果传入两个参数,即:要删除第一项的位置和要删除的项数

console.log(arr.splice(2,3)); // [3, 4, 5]

如果第一个参数为负值,则用原数组项数加上该值确定位置
如果相加后还为负值,则从0位置开始取
如果第二个参数为负值,返回空数组

console.log(arr.splice(-4,2)); // [6, 7]
console.log(arr.splice(-14,2)); // [1, 2]
console.log(arr.splice(-4,-2)); // []

(3)插入:
参数:起始位置、0(要删除的项)、要插入的项(可以是多个)

console.log(arr.splice(-4, 0, "ss", 'dd')); // []
console.log(arr); // [0, 1, 2, 3, 4, 5, "ss", "dd", 6, 7, 8, 9]

(4)替换
参数:起始位置、要删除的项、要插入的项(可以是多个)

console.log(arr.splice(4,2,'ss')); // [4, 5]
console.log(arr); //  [0, 1, 2, 3, "ss", 6, 7, 8, 9]

位置方法

10、indexOf
参数:要查找的项和(可选)查找起始位置索引
返回值:如果在原数组中找到了该项,返回该项在数组中的位置索引;如果没有找到,返回 -1
是否改变原数组:否

console.log(arr.indexOf(2)); // 2

11、lastIndexOf
参数:要查找的项和(可选)查找起始位置索引
返回值:如果在原数组中找到了该项,返回该项在数组中的位置索引;如果没有找到,返回 -1
是否改变原数组:否
使用方法和indexOf类似,只是从数组末尾向前查找

迭代方法

迭代方法的参数都是函数(三个参数,数组某项、索引、原数组)
都不会影响原数组

支持的浏览器:IE9+、 Firefox 2+、Safari 3+、 Opera 9.5+、Chrome

12、every
参数:
返回值:遍历数组每一项,如果每一项都返回true,则返回true
是否改变原数组:否

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var result = arr.every((item, index, array)=>{
  return item>=0;
})
console.log(result); //  true

13、filter
参数:
返回值:遍历数组每一项,返回符合函数的值组成的数组
是否改变原数组:否

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var result = arr.filter((item, index, array)=>{
  return item>5;
})
console.log(result); //  [6, 7, 8, 9]

14、forEach
对数组每一项运行传入的函数,本质上和for循环迭代数组一样
返回值:没有返回值
是否改变原数组:否

arr.forEach((item, index, array)=>{
// 执行操作
})

15、map
参数:
返回值:返回每一项运行传入函数的运行结果组成的数组
是否改变原数组:否

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var result = arr.filter((item, index, array)=>{
  return item * 2;
})
console.log(result); // [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

16、some
参数:
返回值:只要有一个符合传入函数,则返回true
是否改变原数组:否
和every相反

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var result = arr.some((item, index, array)=>{
  return item > 2;
})
console.log(result); // true

归并方法

支持的浏览器:IE9+、 Firefox 3+、Safari 4+、 Opera 10.5+、Chrome

17、reduce
参数:两个参数:第一个是在每一项上调用的函数,第二个是(可选)作为归并基础的初始值
传入函数的参数:上一个值、当前值、索引、原数组
返回值:从第一项开始迭代数组所有项,构建最终返回的值
是否改变原数组:否

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var result = arr.reduce((prev, cur, index, array) => {
  return prev + cur;
});
console.log(arr, result); //[1, 2, 3, 4, 5, 6, 7, 8, 9] 45

18、reduceRight
参数:两个参数:第一个是在每一项上调用的函数,第二个是(可选)作为归并基础的初始值
返回值:从最后一项开始迭代数组所有项,构建最终返回的值
是否改变原数组:否
用法和reduce类似

ES6扩充

1、扩展运算符(spread)
格式:...
将数组转成逗号分割的参数序列
该运算符主要用于函数调用
2、Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。
3、Array.of方法用于将一组值,转换为数组
弥补new Array的缺陷


相关文章

网友评论

      本文标题:2、Array

      本文链接:https://www.haomeiwen.com/subject/kjbxyqtx.html