初始化和创建
concat
:返回一个由当前数组和其它若干个数组或者若干个非数组值组合而成的新数组。
arr1.concat(arr2, arr3);
// or
[...arr1, ...arr2, ...arr3];
Array.of()
将一组参数转换为数组实例。
Array.of(7); // [7]
Array.of(1, 2, 3); // [1, 2, 3]
Array.of(undefined); // [undefined]
// 等同于
Array.of = function() {
return Array.prototype.slice.call(arguments);
}
Array.from()
将类数组结构转换为数组实例。
第一个参数是类数组对象,即任何可迭代的结构,或者有一个 length 属性和可索引元素的结构。
const a1 = [1, 2, 3, 4];
const a2 = Array.from(a1);
console.log(a1); // [1, 2, 3, 4]
alert(a1 === a2); // false
function getArgsArray() {
return Array.from(arguments);
}
console.log(getArgsArray(1, 2, 3, 4)); // [1, 2, 3, 4]
const arrayLikeObject = {
0: 1,
1: 2,
2: 3,
3: 4,
length: 4
};
console.log(Array.from(arrayLikeObject)); // [1, 2, 3, 4]
Array.from() 还接收第二个可选的映射函数参数。这个函数可以直接增强新数组的值。还可以接收第三个可选参数,用于指定映射函数中 this 的值。
const a1 = [1, 2, 3, 4];
const a2 = Array.from(a1, x => x**2);
const a3 = Array.from(a1, function(x) {return x**this.exponent}, {exponent: 2});
console.log(a2); // [1, 4, 9, 16]
console.log(a3); // [1, 4, 9, 16]
Array.prototype.slice()
返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝。原始数组不会被改变。
常用场景:
- 对函数 arguments 对象的转换
添加和删除
**push**
:在数组的末尾增加一个或多个元素,并返回数组的新长度。**unshift**
:在数组的开头增加一个或多个元素,并返回数组的新长度。**pop**
:删除数组的最后一个元素,并返回这个元素**shift**
:删除数组的第一个元素,并返回这个元素。**splice**
:在任意的位置给数组添加或删除任意个元素。排序
**reverse**
:颠倒数组中元素的排列顺序,即原先的第一个变为最后一个,原先的最后一个变为第一个。**sort**
:对数组元素进行排序,并返回当前数组。 ```javascript // 当返回值为负数时,那么前面的数放在前面 // 当为正数,那么后面的数在前 // 为0,不动 arr.sort((a, b) => a - b) // 升序 arr.sort((a, b) => b - a) // 降序
// sort() 不传参的话,会把数组中的元素都转换成字符串比较,按照字符编码的顺序进行排序,如果数组元素是数字的话会得到错的结果。
<a name="90876bd64fbef107514972d7d3d3b1ea"></a>
# 查找
`indexOf` :返回数组中第一个与指定值相等的元素的索引,如果找不到这样的元素,则返回 -1。<br />`lastIndexOf` :返回数组中最后一个(从右边数第一个)与指定值相等的元素的索引,如果找不到这样的元素,则返回 -1。<br />`includes` :返回布尔值,表示是否至少找到一个与指定元素匹配的项。<br />`find` :找到第一个满足测试函数的元素并返回那个元素的值,如果找不到,则返回 undefined。<br />`findIndex` :找到第一个满足测试函数的元素并返回那个元素的索引,如果找不到,则返回 -1。
<a name="109880bec4bdc024365b8ca113e2acfa"></a>
# 遍历
`Array.prototype.forEach` :为数组中的每个元素执行一次回调函数。<br />`Array.prototype.every` :如果数组中的每个元素都满足测试函数,则返回 true,否则返回 false。<br />`Array.prototype.some` :如果数组中至少有一个元素满足测试函数,则返回 true,否则返回 false。<br />`Array.prototype.filter` :将所有在过滤函数中返回 true 的数组元素放进一个新数组中并返回。<br />`Array.prototype.map()` :对赎罪每一项都运行传入的幻术,返回由每次函数调用的结果构成的数组。<br />`Array.prototype.keys` :返回一个数组迭代器对象,该迭代器会包含所有数组元素的键。<br />`Array.prototype.values` :返回一个数组迭代器对象,该迭代器会包含所有数组元素的值。<br />`Array.prototype.entries` :返回一个数组迭代器对象,返回索引/值对。
```javascript
const a = ["foo", "bar", "baz", "qux"];
// 因为这些方法都返回迭代器,所以可以将它们的内容
// 通过Array.from()直接转换为数组实例
const aKeys = Array.from(a.keys());
const aValues = Array.from(a.values());
const aEntries = Array.from(a.entries());
console.log(aKeys); // [0, 1, 2, 3]
console.log(aValues); // ["foo", "bar", "baz", "qux"]
console.log(aEntries); // [[0, "foo"], [1, "bar"], [2, "baz"], [3, "qux"]]
for...of
for...in
const arr = ["foo", "bar", "baz", "qux"];
for(let value of arr) {
console.log(value);
}
for(let i in arr) {
console.log(arr[i]);
}
数组转字符串
join
:连接所有数组元素组成一个字符串。toString
:返回一个由所有数组元素组合而成的字符串。
类数组转数组
方法一:slice
使用 slice
可以用来将一个类数组对象/集合转换成一个新数组。
function list() {
return Array.prototype.slice.call(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]
除了使用 Array.prototype.slice.call(arguments)
,还可以使用 [].slice.call(arguments)
来代替。另外,你可以使用 bind
来简化该过程。
var unboundSlice = Array.prototype.slice;
var slice = Function.prototype.call.bind(unboundSlice);
function list() {
return slice(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]
Array.from
function f() {
return Array.from(arguments);
}
f(1, 2, 3); // [1, 2, 3]
数组去重
Array.from
function combine() {
let arr = [].concat.apply([], arguments); // 没有去重复的新数组
return Array.from(new Set(arr));
}
var m = [1, 2, 2], n = [2, 3, 3];
console.log(combine(m, n)); // [1, 2, 3]
// 或者
let arr = [3, 5, 2, 2, 5, 5];
let unique = [...new Set(arr)];
判断是否是数组
instanceof
在只有一个网页(因而只有一个全局作用域)的情况下,使用 instanceof 操作符就足矣:
if (value instanceof Array) {
// 操作数组
}
使用 instanceof 的问题是假定只有一个全局执行上下文。如果网页里有多个框架,则可能涉及两个不同的全局执行上下文,因此就会有两个不同版本的 Array 构造函数。如果要把数组从一个框架传给另一个框架,则这个数组的构造函数将有别于在第二个框架内本地创建的数组。
isArray
因此,ECMAScript 提供了 Array.isArray() 方法。这个方法的目的就是确定一个值是否为数组,而不用管它是哪个全局执行上下文中创建的。
if (Array.isArray(value)) {
// 操作数组
}
constructor
arr.constructor === Array
因为 constructor 可以被重写,所以不能确保一定是数组。
const str = 'abc';
str.constructor = Array;
str.constructor === Array; // true
Object.prototype.toString
Object.prototype.toString.call(arr) === '[object Array]';
求数组最大值
拍平数组
const arr = [1, 2, 3, 4, [1, 2, 3, [1, 2, 3, [1, 2, 3]]], 5, 'string']
function flat(arr) {
let arrResult = []
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
arrResult = arrResult.concat(flat(arr[i]))
} else {
arrResult.push(arr[i])
}
}
return arrResult
}
console.log(flat(arr))
用 reduce 解决:
const arr = [1, 2, 3, 4, [1, 2, 3, [1, 2, 3, [1, 2, 3]]], 5, 'string', { name: '弹铁蛋同学' }]
function flat(arr) {
return arr.reduce((prev, item) => {
return prev.concat(Array.isArray(item) ? flat(item) : item)
}, [])
}
console.log(flat(arr))