数组
push()
向数组的末尾添加一 个或多个元素,并返回新的长度
let arr = [1, 2, 3];
let length = arr.push(4);
console.log(length); // 4
console.log(arr); // [1, 2, 3, 4]
unshift()
向数组的开头添加一个或多个元素,并返回新的长度
const arr = [1, 2, 3];
const length = arr.unshift(0, 1, 2);
console.log(arr); // [0, 1, 2, 1, 2, 3]
console.log(length); // 6
手写 unshift 方法
方式一:使用 splice 方法
Array.prototype.myUnshift = function () {
const length = arguments.length;
for (let i = length - 1; i >= 0; i--) {
this.splice(0, 0, arguments[i]);
}
return this.length;
};
const arr = [1, 2, 3];
console.log(arr.myUnshift(0, 1, 2));
console.log(arr);
方式二、移动元素
Array.prototype.myUnshift = function (...elements) {
const length = this.length;
// 扩大数组长度以容纳新元素
this.length += elements.length;
// 从后向前遍历数组,将每个元素向后移动elements.length个位置
for (let i = length - 1; i >= 0; i--) {
this[i + elements.length] = this[i];
}
// 将新元素插入到数组开头
for (let i = 0; i < elements.length; i++) {
this[i] = elements[i];
}
return this.length;
};
const arr = [1, 2, 3];
console.log(arr.myUnshift(0, 1, 2));
console.log(arr);
pop()
删除并返回数组的最后一个元素
const arr = [1, 2, 3];
const item = arr.pop();
console.log(item); // 3
console.log(arr); // [1, 2]
shift()
删除并返回数组的第一个元素,改变原数组。
let arr = [3, 4, 2, 1, 5];
arr.shift(); // 3
console.log(arr); // [4, 2, 1, 5]
join()
把数组的所有元素放入一个字符串,元素通过指定的分隔符分隔,不影响原数组。
let arr = [2, 1, 3];
let res = arr.join(); // '2,1,3'
arr.join(''); // '213'
arr.join('-'); // '2-1-3'
toString()
将数组转换为字符串,并返回结果
let arr = [1, 2, 3];
console.log(arr.toString()); // '1,2,3'
concat()
将数组或者值连接成新数组,不影响原数组,返回新数组。
let arr1 = [2, 1, 3];
let arr2 = [4, 5];
let rs1 = arr1.concat(arr2);
let rs2 = arr1.concat(4);
let rs3 = arr1.concat(6, [7, 8]);
console.log(rs1); // [2, 1, 3, 4, 5]
console.log(rs2); // [2, 1, 3, 4]
console.log(rs3); // [2, 1, 3, 6, 7, 8]
sort()
对数组的元素排序,接收一个函数作为参数,影响原数组。
如果省略参数,元素按照转换为字符串的各个字符的 Unicode
位点进行排序。
- 字符串排序
const arr2 = ['zgh', '唔西迪西', 'ivan'];
arr2.sort(); // ['ivan', 'zgh', '唔西迪西']
arr2.sort((a, b) => a - b); // ['zgh', '唔西迪西', 'ivan']
- 数字排序
const arr = [3, 5, 2, 4, 1];
arr.sort(); // [1,2,3,4,5]
// 比较的数字会先被转换为字符串,比较Unicode顺序
const arr1 = [5, 10, 20];
arr1.sort(); // [10, 20, 5]
arr.sort((a, b) => a - b); // 正序 [1, 2, 3, 4, 5]
arr.sort((a, b) => b - a); // 倒序 [5, 4, 3, 2, 1]
- 对象数组排序
const arr = [
{ name: '玛卡巴卡', desc: 'one' },
{ name: '唔西迪西', desc: 'two' },
{ name: '桥豆麻袋', desc: 'three' }
]
arr.sort((a, b) => a.name.localeCompare(b.name))
// 结果
0: {name: '玛卡巴卡', desc: 'one'}
1: {name: '桥豆麻袋', desc: 'three'}
2: {name: '唔西迪西', desc: 'two'}
reverse()
把数组中的元素顺序颠倒过来,影响原数组
let arr = [1, 2, 3];
let res = arr.reverse();
console.log(res); // [3, 2, 1]
console.log(arr); // [3, 2, 1]
slice()
从数组中截取一段元素,组成一个新的数组,不会影响原数组
语法:array.slice(start[, end])
- 新数组包括
start
,不包括end
- 若没指定
end
,则从start
截取到数组结束的所有元素 - 新数组是对原数组的浅拷贝,原数组不会被改变
let arr = [1, 2, 3, 4, 5];
arr.slice(0, 3); // [1, 2, 3]
arr.slice(-5, -1); // [1, 2, 3, 4]
arr.slice(1); // [2, 3, 4, 5]
arr.slice(); // [1, 2, 3, 4, 5]
arr.slice(-1); // 5,可以很方便的拿到数组最后一项元素
为什么说新数组是对原数组的浅拷贝?
const arr1 = [{ a: 1 }, 2, 3];
const arr2 = arr1.slice(0, 1); // [{ a: 1 }]
arr1[0].a = 9;
console.log(arr2); // [{ a: 9 }]
可以看到改变原数组的值,新数组也随之改变,复制到的对象只是一个引用
splice()
删除或者添加元素,改变原数组
语法:array.splice(index, count, item1, item2, ...)
,count 表示元素数量,不是结束下标。
- 添加元素:传入三个参数,分别是开始位置、0、插入的元素,返回空数组
- 删除元素:传入两个参数,分别是开始位置、删除元素的数量,返回包含删除元素的数组
删除元素,得到新数组:
const arr = [1, 2, 3, 4, 5];
const newArr = arr.splice(0, 2);
console.log(newArr); // [1, 2]
console.log(arr); // [3, 4, 5]
替换数组中的元素:
let arr = ['a', 'b', 'c', 'd'];
arr.splice(1, 2, 'e', 'f');
console.log(arr); // ["a","e","f","d"]
向数组中插入元素,count 数量设为 0,返回空数组
let arr = ['a', 'b', 'c', 'd'];
// 向数组中间插入元素
arr.splice(1, 0, 'e', 'f');
console.log(arr); // ['a', 'e', 'f', 'b', 'c', 'd']
// 向数组开头插入元素
// arr.splice(0, 0, 'e', 'f');
// 向数组末尾插入元素
// arr.splice(arr.length, 0, 'e', 'f');
filter()
逐一过滤数组元素,返回符合条件的元素,得到一个新数组
let arr = [1, 2, 3];
let rs = arr.filter(item => item > 1);
console.log(rs); // [2, 3]
// 删掉偶数,只保留奇数
let arr = [1, 2, 4, 5, 6, 9, 10, 15];
let r = arr.filter(function (x) {
return x % 2 !== 0;
});
console.log(r); // [1, 5, 9, 15]
//把一个Array中的空字符串删掉
let arr = ['A', '', 'B', null, undefined, 'C', ' '];
let r = arr.filter(function (s) {
return s && s.trim(); // 注意:IE9以下的版本没有trim()方法
});
console.log(r); // ['A', 'B', 'C']
filter()接收的回调函数,可以有多个参数。通常仅使用第一个参数,表示 Array 的某个元素。回调函数还可以接收另外两个参数,表示元素的位置和数组本身
let arr = ['A', 'B', 'C'];
let r = arr.filter((element, index, self) => {
console.log(element); // 依次打印'A', 'B', 'C'
console.log(index); // 依次打印0, 1, 2
console.log(self); // self就是变量arr
return true;
});
例子:
- 数据去重
const arr = ['a', 's', 'b', 'p', 'a', 'k', 'k', 's'];
arr.filter((ele, index, self) => self.indexOf(ele) === index); // ['a', 's', 'b', 'p', 'k']
// indexOf总是返回某个元素第一次出现的位置,后续重复元素的位置与indexOf返回的位置不相等,因此被filter滤掉了
- 过滤虚假值,即
0
,undefined
,null
,false
,""
,''
const array = [3, 0, 6, 7, '', false];
array.filter(Boolean); // [1, 3, 5]
indexOf()
返回要查找的元素在数组中的位置,如果没找到则返回 -1,可用来判断数组中是否包含指定元素
语法 array.indexOf(item, start)
,item
查找的元素,start
开始检索的位置(可选,默认是 0)
let fruits = ['Banana', 'Orange', 'Apple', 'Mango'];
let a = fruits.indexOf('Apple'); // 2
let fruits = ['Banana', 'Orange', 'Apple', 'Mango', 'Banana', 'Orange', 'Apple'];
let a = fruits.indexOf('Apple', 4); // 6
if (fruits.indexOf('Apple') > -1) {
alert('Apple');
}
若查找字符串最后出现的位置,用 lastIndexOf()
方法
includes()
判断元素是否在数组中存在 ,返回值是 true
或false
语法 array.includes(item, start)
,item
要查找的元素,start
开始检索的位置(可选,默认是 0),正向查找
如果 start 为负值,则使用数组长度 + start
的计算结果作为新的索引
let arr = [1, 2, 3];
arr.includes(1); // true
arr.includes(2, -1); // false