Array API
一、创建与转换数组
Array.from(iterable, mapFn)
将==类数组==对象(如arguments、DOM 集合)或==可迭代对象==(如字符串、Set)转换为数组,可选的mapFn用于加工元素。javascript// 转换字符串为数组 console.log(Array.from("hello")); // ["h", "e", "l", "l", "o"] // 转换类数组并加工 const arrLike = { length: 3, 0: 1, 1: 2, 2: 3 }; console.log(Array.from(arrLike, x => x * 2)); // [2, 4, 6]Array.of(element1, ...)
创建一个包含所有参数的数组(解决new Array(n)当n为数字时创建空数组的问题)。javascriptconsole.log(Array.of(1, 2, 3)); // [1, 2, 3] console.log(Array.of(5)); // [5](区别于 new Array(5) 返回长度为5的空数组)
二、添加/删除元素
push(...elements)
向数组末尾添加元素,返回新的长度。javascriptconst arr = [1, 2]; arr.push(3, 4); console.log(arr); // [1, 2, 3, 4]pop()
删除数组最后一个元素,返回被删除的元素。javascriptconst arr = [1, 2, 3]; console.log(arr.pop()); // 3 console.log(arr); // [1, 2]unshift(...elements)
向数组开头添加元素,返回新的长度。javascriptconst arr = [3, 4]; arr.unshift(1, 2); console.log(arr); // [1, 2, 3, 4]shift()
删除数组第一个元素,返回被删除的元素。javascriptconst arr = [1, 2, 3]; console.log(arr.shift()); // 1 console.log(arr); // [2, 3]splice(startIndex, deleteCount, ...addElements)
从startIndex开始(包括)删除deleteCount个元素,并插入新元素,返回被删除的元素组成的数组。javascriptconst arr = [1, 2, 3, 4]; // 从索引1开始,删除2个元素,插入5、6 const deleted = arr.splice(1, 2, 5, 6); console.log(arr); // [1, 5, 6, 4] console.log(deleted); // [2, 3]
三、查询与过滤
indexOf(searchElement, fromIndex)/lastIndexOf(searchElement)
查找元素首次/最后一次出现的索引,未找到返回-1。javascriptconst arr = [1, 2, 3, 2, 1]; console.log(arr.indexOf(2)); // 1 console.log(arr.lastIndexOf(2)); // 3includes(searchElement)
判断数组是否包含指定元素,返回布尔值。javascriptconsole.log([1, 2, 3].includes(2)); // true console.log([1, 2, 3].includes(4)); // falsefind(callback)/findIndex(callback)find:返回第一个满足callback条件的元素(无则返回undefined)。findIndex:返回第一个满足条件的元素的索引(无则返回-1)。
javascriptconst users = [ { id: 1, name: "Alice" }, { id: 2, name: "Bob" } ]; console.log(users.find(u => u.id === 2)); // { id: 2, name: "Bob" } console.log(users.findIndex(u => u.name === "Alice")); // 0filter(callback)
返回所有满足callback条件的元素组成的新数组。 ==过滤==javascriptconst numbers = [1, 2, 3, 4, 5]; const evens = numbers.filter(n => n % 2 === 0); console.log(evens); // [2, 4]
四、遍历与转换
forEach(callback)
遍历数组,对每个元素执行callback(==无返回值==)。javascript[1, 2, 3].forEach((item, index) => { console.log(`索引${index}的值:${item}`); }); // 输出: // 索引0的值:1 // 索引1的值:2 // 索引2的值:3map(callback)
对每个元素执行callback,返回加工后的新数组。 ==加工==javascriptconst numbers = [1, 2, 3]; const squared = numbers.map(n => n * n); console.log(squared); // [1, 4, 9]reduce(callback, initialValue)
从左到右累计处理数组元素,返回最终结果(可用于求和、扁平化等)。javascript// 求和 const sum = [1, 2, 3, 4].reduce((acc, curr) => acc + curr, 0); console.log(sum); // 10 // 扁平化数组 const nested = [1, [2, 3], [4, 5]]; const flat = nested.reduce((acc, curr) => acc.concat(curr), []); console.log(flat); // [1, 2, 3, 4, 5]flat(depth)
扁平化数组,depth指定层级(默认1,Infinity表示完全扁平化)。javascriptconst deep = [1, [2, [3, [4]]]]; console.log(deep.flat(1)); // [1, 2, [3, [4]]] console.log(deep.flat(Infinity)); // [1, 2, 3, 4]
五、排序与反转
sort(compareFunction)
对数组排序(默认按字符串 Unicode 码排序,需自定义比较函数)。javascriptconst numbers = [3, 1, 4, 1, 5]; // 数字升序 numbers.sort((a, b) => a - b); console.log(numbers); // [1, 1, 3, 4, 5] // 数字降序 numbers.sort((a, b) => b - a); console.log(numbers); // [5, 4, 3, 1, 1]reverse()
反转数组元素顺序(修改原数组)。javascriptconst arr = [1, 2, 3]; arr.reverse(); console.log(arr); // [3, 2, 1]
六、其他常用方法
slice(startIndex, endIndex)
截取从startIndex(包括) 到endIndex(不包含)的元素,返回新数组(不修改原数组)。javascriptconst arr = [1, 2, 3, 4]; console.log(arr.slice(1, 3)); // [2, 3] console.log(arr.slice(-2)); // [3, 4](从倒数第2位开始)join(separator)
用separator连接数组元素为字符串(默认用逗号连接)。javascriptconst arr = ["hello", "world"]; console.log(arr.join(" ")); // "hello world"every(callback)/some(callback)every:判断所有元素是否满足callback条件(全满足返回true)。some:判断是否有至少一个元素满足条件(有则返回true)。
javascriptconst ages = [18, 20, 22]; console.log(ages.every(age => age >= 18)); // true(所有都成年) console.log(ages.some(age => age > 21)); // true(有一个超过21)将数组转化为逗号分隔的字符串
// 法1
arr = [1, 13, 4, 5]
console.log(arr.toString())// 1,13,4,5
// 法2
const arr = ["苹果", "香蕉", "橙子"];
const str = arr.join(','); // 结果:"苹果,香蕉,橙子"总结
- 增删元素用
push/pop/unshift/shift/splice(注意是否修改原数组)。 - 查询过滤用
find/filter/includes/indexOf。 - 遍历转换用
forEach/map/reduce/flat。 - 排序反转用
sort/reverse。
这些方法覆盖了数组操作的大部分场景,合理使用能大幅简化代码。
数组
使用new Array()声明一个新的数组。
let arr = new Array();
let arr1 = [];判断一个值是不是数组:
const isArray =
Array.isArray || ((list) => ({}.toString.call(list) === "[object Array]"));
console.log(isArray);//[Function: isArray]数组的填充
// 方法一:
const shit = Array(100).fill(0);
console.log(shit);
// 方法二:
// 注: 如果直接使用 map,会出现稀疏数组
console.log(Array.from(Array(100), (x) => (x = 0)));
// 方法二变体:
console.log(Array.from({ length: 100 }, (x) => (x = 0)));
//那我就用map呢
console.log(Array(100).map((x) => (x = 0)));
//[ <100 empty items> ]可以替换元素,或者向数组新加一个元素,length 属性的值是数组中元素的总个数,也可以用 alert 来显示整个数组。数组可以存储任何类型的元素。
let arr = new Array();
let arr1 = [
2,
'shit',
function () {
log("eat");
},
];
arr1[2]();//eat
log(arr1.length);//3我们可以显式地计算最后一个元素的索引,然后访问它:fruits[fruits.length - 1] 幸运的是,这里有一个更简短的语法 fruits.at(-1)
pop 取出并返回数组的最后一个元素
push 在数组末端添加元素
shift 取出数组的第一个元素并返回它
unshift 在数组的首端添加元素
push 和 unshift 方法都可以一次添加多个元素 push/pop 方法运行的比较快,而 shift/unshift 比较慢
当我们修改数组的时候,length 属性会自动更新。准确来说,它实际上不是数组里元素的个数,而是最大的数字索引值加一。length 属性的另一个有意思的点是它是可写的。清空数组最简单的方法就是:arr.length = 0;
数组没有 Symbol.toPrimitive,也没有 valueOf,它们只能执行 toString 进行转换
不应该使用 == 运算符比较 JavaScript 中的数组
另外拷贝数组和拷贝对象很像,同样的他们会指向同一个引用,共享里面的数据。
splice函数: 它从索引 start 开始修改 arr:删除 deleteCount 个元素并在当前位置插入 elem1, ..., elemN。最后返回被删除的元素所组成的数组。
let arr1 = [
2,
'shit',
function () {
log("eat");
},
];
arr1.splice(0, 3, '1', '2', 3);
console.log(arr1);//[ '1', '2', 3 ]slice: 它从索引 start 开始修改 arr:删除 deleteCount 个元素并在当前位置插入 elem1, ..., elemN。最后返回被删除的元素所组成的数组。
concat: 结果是一个包含来自于 arr,然后是 arg1,arg2 的元素的新数组。
let array = [1, 2];
let array1 = [3, 4];
let array2 = [5];
let array3=array.concat(array1, array2);
log(array3);//[ 1, 2, 3, 4, 5 ]forEach:
let arr = [1, 2, 3, 4, 5, 6];
arr.forEach((item,index,array) => {
log(item);// 1 2 3 4 5 6
});arr.indexOf(item, from)—— 从索引from开始搜索item,如果找到则返回索引,否则返回-1。arr.includes(item, from)—— 从索引from开始搜索item,如果找到则返回true(译注:如果没找到,则返回false)。- 通常使用这些方法时只会传入一个参数:传入
item开始搜索。默认情况下,搜索是从头开始的 - 方法 arr.lastIndexOf 与
indexOf相同,但从右向左查找
reduce:累加方法 every:检测每一个值的
数组方法备忘单:
添加/删除元素:
- with:没有使用过
push(...items)—— 向尾端添加元素,pop()—— 从尾端提取一个元素,shift()—— 从首端提取一个元素,unshift(...items)—— 向首端添加元素,splice(pos, deleteCount, ...items)—— 从pos开始删除(包括)deleteCount个元素,并插入items。slice(start, end)—— 创建一个新数组,将从索引start到索引end(但不包括end)的元素复制进去。concat(...items)—— 返回一个新数组:复制当前数组的所有元素,并向其中添加items。如果items中的任意一项是一个数组,那么就取其元素。
搜索元素:
indexOf/lastIndexOf(item, pos)—— 从索引pos开始搜索item,搜索到则返回该项的索引,否则返回-1。includes(value)—— 如果数组有value,则返回true,否则返回false。find/filter(func)—— 通过func过滤元素,返回使func返回true的第一个值/所有值。findIndex和find类似,但返回索引而不是值。
遍历元素:
forEach(func)—— 对每个元素都调用func,不返回任何内容。
转换数组:
map(func)—— 根据对每个元素调用func的结果创建一个新数组。sort(func)—— 对数组进行原位(in-place)排序,然后返回它。reverse()—— 原位(in-place)反转数组,然后返回它。split/join—— 将字符串拆分为数组并返回/将数组项组合成字符串并返回。reduce/reduceRight(func, initial)—— 通过对每个元素调用func计算数组上的单个值,并在调用之间传递中间结果。
其他:
Array.isArray(value)检查value是否是一个数组,如果是则返回true,否则返回false。