【JavaScript】数组方法 (ES6)

实例方法

find

arr.find(callback) 用于获取第 1 个符合要求的元素:

  1. callback(item, index, arr) => boolean
    item-当前值、index-当前索引、arr-当前数组
  • 返回值:callback 第一次返回 true 的对应 item;如果没有符合的元素,则返回 undefined
js 复制代码
const arr = [50, 10, 201, 103, 62, 81];
const res = arr.find(val => val > 100);
console.log(res); // 201

findIndex

arr.findIndex(callback) 用于获取第 1 个符合要求的元素的下标:

  1. callback(item, index, arr) => boolean
    item-当前值、index-当前索引、arr-当前数组
  • 返回值:callback 第一次返回 true 的对应 index;如果没有符合的元素,则返回 -1
js 复制代码
const arr = [{ name: 'aa' }, { name: 'bb' }]; // 数组元素为对象
const res = arr.findIndex(val => val.name == 'bb');
console.log(res); // 1

fill

arr.fill(value[, start[, end]]) 用于填充数组:

  1. value:用于填充数组的值
  2. start:开始填充的下标(包含),默认为 0
  3. end:结束填充的下标(不包含),默认为 arr.length
  • 会改变原数组
  • 返回值:填充后的新数组
js 复制代码
const arr1 = new Array(3);
arr1.fill('pad');
console.log(arr1); // ['pad', 'pad', 'pad']

const arr2 = new Array(5);
arr2.fill('pad', 1, 3);
console.log(arr2); // [empty, 'pad', 'pad', empty × 2]

fill 的填充操作可以认为是 "赋值"。所以填充引用类型数据时,其实所有元素都指向同一个地址:

js 复制代码
const arr = new Array(3);
arr.fill({ name: 'cc' });
arr[0].name = 'aa'; // 修改其中一项
console.log(arr); // [{name: "aa"}, {name: "aa"}, {name: "aa"}]

可以先为空数组填充 null,再通过 map()null 修改为对象 {}。这样填充的数组元素就是不同的对象啦。

必须先为空数组填充 null,因为 map 会跳过空项,不对其进行操作。

js 复制代码
const nullArr = new Array(3).fill(null);
const arr = nullArr.map(() => ({}));
arr[0].name = 'aa';
console.log(arr); // [{name:'aa'}, {}, {}]

includes

arr.includes(value) 用于查看数组中是否包含指定数据:

  1. value:查找的数据
  • 返回值:找到指定数据,则返回 true;否则返回 false
js 复制代码
const arr = ['apple', 'origan', 'banana'];
const a = arr.includes('apple');
console.log(a); // true

const b = arr.includes('pear');
console.log(b); // false

Array.prototype.indexOf 方法有 2 个缺点:

① 不够语义化,它是找到参数值的第 1 次出现位置,所以要去比较返回值是否等于 -1,表达起来不够直观

② 内部使用严格相等运算符 === 进行判断,因为 NaN !== NaN,所以不能检测 NaN 是否在数组中

js 复制代码
const arr = [1, NaN];
console.log(arr.indexOf(NaN)); // -1
console.log(arr.includes(NaN)); // true

注意:任何字符串查找空字符串 '',都返回 true

js 复制代码
'asd'.inciudes(''); // true

静态方法

isArray

Array.isArray(value) 用于判断参数是不是数组:

  • 返回值:value 是数组 则返回 truevalue 不是数组 则返回 false
js 复制代码
const arr = [1, 2, 4, 5, 3];
const result = Array.isArray(arr);
console.log(result); // true

from

Array.from(arrObj[, callback[, thisObj]]) 可基于 [类数组对象] / [可迭代对象] 创建一个新的、浅拷贝的数组

  1. arrObj:类数组对象 / 可迭代对象
  2. callback(item, index) => newItem
    item-当前数据项、index-当前数据项的索引
    newItem 默认为 item
  3. thisObjcallbackthis 指向(箭头函数不生效 thisObj 配置项)
  • 返回值:新创建的、浅拷贝的数组
js 复制代码
const arr = [1, 1, 2];
const newArr = Array.from(new Set(arr)); // 转 Set 可去重; set 为可迭代对象
console.log('newArr', newArr); // newArr [ 1, 2 ]
js 复制代码
const arr = [1, 1, 2];
const newArr = Array.from(new Set(arr), item => item * 2);
console.log('newArr', newArr); // newArr [ 2, 4 ]

from 方法可以作用于 [字符串],因为字符串也是可迭代对象:

js 复制代码
const str = 'man';
const arr1 = Array.from(str);
console.log(arr1); // ['m', 'a', 'n']

// 这里等效于字符串的 split 方法
const arr2 = str.split('');
console.log(arr2); // ['m', 'a', 'n']

from 方法还可以作用于 [下标为属性名,带 length 属性的类数组对象]

js 复制代码
const obj = {
    0: 'a',
    1: 'b',
    2: 'c',
    length: 3,
};
const arr = Array.from(obj);
console.log(arr); // ["a", "b", "c"]

from 方法可用于浅拷贝数组:

js 复制代码
const arr = [1, 2, 3];
const copyArr = Array.from(arr);
console.log('arr', arr); // arr [1, 2, 3]
console.log('copyArr', copyArr); // copyArr [1, 2, 3]

of

Array.of(data[, ...]) 用于创建数组:

  1. data:数组的元素,可传递多个 data 参数
  • 返回值:新创建的数组
js 复制代码
const arr = Array.of('a', 'b', 'c', 'd');
console.log(arr); // [ 'a', 'b', 'c', 'd' ]

该方法的主要目的,是弥补数组构造函数 Array() 的不足。因为不同的参数个数,会导致不同的 Array() 的行为。

js 复制代码
new Array(); // []
new Array(3); // [empty, empty, empty]
new Array(3, 11, 8); // [3, 11, 8]

Array.of(); // []
Array.of(3); // [3]
Array.of(3, 11, 8); // [3, 11, 8]

关于数组的空位

数组的空位:数组的某一个位置没有值

js 复制代码
const arr = [1, , 3];

ES5 对空位的处理很不一致,多数情况下会忽略空位。

  • for ... in 会忽略空位
js 复制代码
for (let i in [, ,]) {
    console.log(i);
}
  • forEachfiltersomereduce 都会直接忽略空位
js 复制代码
const arr = [1, , 3];
console.log(arr); // [1, empty, 3]
const newArr = arr.filter(item => true);
console.log(newArr); // [ 1, 3 ]
  • map 操作元素时,会保留空位 (及跳过空位,不对其进行操作)
js 复制代码
const arr = [1, , 3];
const newArr = arr.map(item => item + 1);
console.log(newArr); // [2, empty, 4]
  • jointoString 会将空位处理成空字符串 ''
js 复制代码
const arr = [1, , 3];
console.log(arr); // [1, empty, 3]
const str = arr.join(',');
console.log(str); // 1,,3

ES6 则是明确将空位转为 undefined

  • for ... of 会遍历空位
js 复制代码
for (let i of [, ,]) {
    console.log(i); // undefined undefined  最后一个 , 会被视为尾逗号,所以只输出两次
}
  • 扩展运算符 ...
js 复制代码
[...['a', , 'b']]; // ["a", undefined, "b"]
  • entrieskeysvalues
js 复制代码
[...[, 'a'].keys()]; // [0,1]
[...[, 'a'].values()]; // [undefined,"a"]
[...[, 'a'].entries()]; // [[0,undefined], [1,"a"]]
  • findfindIndex
js 复制代码
[, 'a'].find(item => true); // undefined
[, 'a'].findIndex(item => true); // 0
  • fill
js 复制代码
new Array(3).fill('a'); // ["a","a","a"]
  • includes
js 复制代码
let arr = ['apple', , 'banana'];
let result = arr.includes(undefined);
console.log(result); // true
  • from
js 复制代码
Array.from(['a', , 'b']); // ["a", undefined, "b"]

相关知识:

  1. 【JavaScript】数组简介
  2. 【JavaScript】数组实例方法 (ES5)
  3. 【JavaScript】高阶数组实例方法 (ES5)
相关推荐
Merlyn1010 分钟前
npm : 无法加载文件 E:\ProgramFiles\Nodejs\npm.ps1,因为在此系统上禁止运行脚本。
前端·npm·node.js
一个打工仔的笔记10 分钟前
npm i 失败权限问题
前端·npm·node.js
heroboyluck12 分钟前
rust 前端npm依赖工具rsup升级日志
前端·rust·npm
咔咔库奇30 分钟前
【react】进阶教程02
前端·react.js·前端框架
七灵微42 分钟前
【前端】react大全一本通
前端·react.js·前端框架
初遇你时动了情42 分钟前
react使用react-quill 富文本插件、加入handlers富文本不显示解决办法
前端·javascript·react.js
海上彼尚1 小时前
RawShaderMaterial 与 ShaderMaterial
前端·javascript
网络安全-老纪1 小时前
【网络安全】常见的web攻击
前端·安全·web安全
一直走下去-明1 小时前
next.js-学习2
开发语言·javascript·学习
小仙有礼了1 小时前
ArcGis for js 4.x实现测量,测距,高程的功能
javascript·算法·arcgis