JS数组常用的方法

JavaScript/前端
391
0
0
2023-03-13

JS 数组常用的方法(个人感觉)

1. forEach()

循环,无法在中间停止

img

2. some()

循环,找到符合条件的之后,可以通过 return true 退出循环

img

3. every()

测试数组中的所有元素是否都能通过某个指定函数的测试。返回一个布尔值。

const arr = [-1, 3, 4, 5, 6];

let result = arr.every((value) => value > 0); //-1不满足条件,所以返回false
console.log(result);

arr[0] = 1;
result = arr.every((value) => value > 0); //全部满足条件,所以返回true
console.log(result);

4. filter()

创建一个新数组,它包含符合某个指定函数的测试的所有元素

img

5. reduce()

实现累加

arr.reduce((累加的结果, 当前循环项) => {}, 初始值)

const arr = [1, 3, 7];

let result = arr.reduce((sum, value) => (sum += value), 0);
console.log(result); //输出11

搭配 filter()实现,累加选中状态的总价格

const arr = [
  {
    id: 1,
    name: "西瓜",
    state: true,
    price: 10,
    count: 1,
  },
  {
    id: 2,
    name: "榴莲",
    state: false,
    price: 80,
    count: 2,
  },
  {
    id: 3,
    name: "草莓",
    state: true,
    price: 20,
    count: 3,
  },
];

const amount = arr
  .filter((item) => item.state)
  .reduce((amount, item) => (amount += item.price * item.count), 0);
console.log(amount); //返回70

6. map()

map()方法把调用它的数组的每一个元素分别传给指定的函数,返回这个函数的返回值构成的数组

let a = [1, 2, 3];
let newA = a.map((v) => v * v);
console.log(newA);

let a = [1, , 2, , 3]; // 如果数组是稀疏的,缺失元素不会调用函数,但是返回的数组也会和原始数组一样稀疏
let newA = a.map((v) => v * v);
console.log(newA);

7. find()

遍历数组,寻找第一个符合条件的元素,找到就停止迭代

let a = (a = [1, 2, 3, 4, 5]);
console.log(a.find((v) => v >= 2));
console.log(a.find((v) => v < 0)); // 找不到符合条件的,返回undefined

8. flat()

用于打平数组(把嵌套数组变为普通的数组元素)

let a = [1, [2, 3]];
console.log(a.flat());

a = [1, [2, [3]]];
console.log(a.flat()); // 不带参,只会打平一级嵌套

a = [1, [2, [3, [4]]]];
console.log(a.flat(1));
console.log(a.flat(2)); // 带参,可以打平多级嵌套
console.log(a.flat(3));
console.log(a.flat(4)); // 打平后的数组如果没有嵌套数组,则不会再被打平

a = [1, [2, 3, [4, 5, 6, [7, 8, [9, 10, [11, 12]]]]]];
console.log(a.flat(Infinity)); // 通过Infinity实现把任意嵌套数组打平为不嵌套的数组

9. concat()

let a = [1, 2, 3];
let b = [4, 5, 6];
console.log(b.concat(a)); // 拼接两个数组
console.log(b.concat(1, 2)); // 也可以添加元素。不会改变原数组,而是创建新数组

10. push()、pop()、shift()、unshift()

let a = [];
a.push(1);
console.log(a.push(2, 3)); // push()在数组末尾添加元素,并返回数组的新长度
console.log(a);

console.log(a.pop()); // pop()删除数组末尾的元素,并返回删除的元素
console.log(a);

console.log(a.unshift(11, 22)); // unshift()在数组的开头添加元素,并返回数组的新长度
console.log(a);

console.log(a.shift()); // shift()删除数组开头的元素,并返回删除的元素
console.log(a);

11. slice()、splice()

let a = [1, 2, 3, 4, 5, 6, 7, 8];
console.log(a.slice(3, 6)); // 截取数组的一部分,返回一个新数组,第一个参数是起点,第二个是终点(但不包含终点)
console.log(a);

console.log(a.slice(2)); // 一个参数,则是从起点截到数组的末尾

console.log(a.slice(-4, -2)); // 可以是负数,-1表示倒数第一,-2表示倒数第二

console.log(a.slice(6, 0)); // 返回[], 不能往回截

/*************************/
a = [1, 2, 3, 4, 5, 6, 7, 8]; // splice()会改变数组
console.log(a.splice(2, 3, "Hello", "Hi")); // splice()的第一个参数是起点,第二个参数是要删除的元素个数,之后的参数是要插入的元素,返回删除的数组
console.log(a);

console.log(a.slice(3)); // 只有一个参数,则删除数组开头到起点的全部元素

12. indexOf()、lastIndexOf()

let a = [1, 2, 3, 4, 2, 1];
console.log(a.indexOf(2)); // 返回1, 数组a中第一个是2的元素的索引值是1
console.log(a.lastIndexOf(2)); // 返回4, 数组a中最后一个是2的元素的索引值是4
console.log(a.lastIndexOf(99)); // 返回-1,找不到

console.log(a.indexOf(2, 2)); // 从索引值为2的元素开始找
console.log(a.lastIndexOf(2, -3)); // 从倒数第三个元素开始找

13. includes()

let a = [1, "Hello", true];
console.log(a.includes(true)); // 返回true,因为数组中有true这个元素
console.log(a.includes(2)); // 返回false

14. fill()

let a = new Array(7);
console.log(a.fill(0)); // 可以用于数组的初始化, 返回一个新数组
console.log(a.fill(7, 2)); // 从索引2开始把数组元素设置为7
console.log(a.fill(3, 2, -2)); // 第一个参数是要设置的值,第二个参数是起点,第三个参数是终点,可以是负数

15. join()、split()

// join()用于把所有元素转换成字符串
let a = [1, 2, 3];
console.log(a.join()); // 默认使用逗号当分隔符
console.log(a.join(" ")); // 使用空格当作分隔符

// split()用于把字符串按指定分隔符转换成数组
a = "Hello world!";
console.log(a.split(""));
a = "Hello, world!";
console.log(a.split(","));

16. sort()

sort()方法对数组元素按字母顺序对数组元素排序

let arr = [1, 2, 11, 23, 22, 111, 12, 9, 8];
console.log(arr.sort());

结果:

img

可以传入一个回调函数,来自定义排序规则。

回调函数的格式是

(a, b) => {
  // a, b是数组中任意两个数
  return xxx;
};

当返回值大于 0 时,a 排在 b 的后面;

当返回值小于 0 时,a 排在 b 的前面;

当返回值等于 0 时,a 和 b 的顺序不改变。

所以,要实现升序排序,可以按下面的方法

let arr = [1, 2, 11, 23, 22, 111, 12, 9, 8];
console.log(
  arr.sort((a, b) => {
    if (a > b) {
      return 1;
    } else if (a < b) {
      return -1;
    } else {
      return 0;
    }
  })
);

上面的代码还可以简化为:

let arr = [1, 2, 11, 23, 22, 111, 12, 9, 8];
console.log(arr.sort((a, b) => a - b));
/* 要实现降序的话,则是变为return b - a; */

原因(看不懂的话,结合上面红字):

当 a > b 时,

a - b > 0, return a - b 排序的结果 ==> b, a (升序)

b - a < 0, return b - a 排序的结果 ==> a, b (降序)

当 a < b 时,

a - b < 0, return a - b 排序的结果 ==> a, b (升序)

b - a > 0, return b - a 排序的结果 ==> b, a (降序)

当 a = b 时,

a - b = b - a = 0, return a - b 和 return b - a 排序结果都不变

从上面所有的情况,可以发现,无论 a > b,还是 a < b, return a - b 总能得到升序的结果,return b - a 总能得到降序的结果