Array

106 阅读8分钟

array.at() 根据索引找值

数组的取值方法。接收一个整数值返回该索引的值,可以输入正负值,负值从后向前倒数。

array.concat() 数组拼接

数组拼接方法。用于拼接两个或多个数组。返回一个新数组、传入多维数组只展开一层、不过滤相同元素。 a.concat(b,c)

Array.from() 大A,

数组对像的方法,将一个类数组可遍历的对象 转换成一个真数组。

  • 类数组(有length属性、属性名(key)必须是数字或字符串数字)转为真数组
  • Set的数据结构转换成真数组
  • 传入字符串,会转换成字符传分割的数组
  • 传入真数组,返回一模一样的新数组
  • 可以接收第二个参数Fn,类似于数组map的方法,处理返回每一项的值(Array.from(set, item => item + 1))

注: 类数组的属性名(key)必须是数字或字符串数字,不然转成后会成为有length的undefined

Array.isArray()

检测一个对象是否为数组。

if(!Array.isArray){
    Array.isArray = function(value) {
      return Object.prototype.toString.call(value) === '[object Array]';
    }
}

typeof、Array.isArray()、Object.prototype.toString.call(val)、instanceof

Array.of() 大A,值转为数组

用于将一组值转换为数组

Array.of(3,5,8)   //[3, 5, 8]
Array.of()        // []

// 为了弥补 array()方法的缺陷
Array(3)     //[ , , ]
Array.of(3)  // [3]

//模拟
function ArrayOf{
    return [].slice.call(arguments)
}

array.copyWithin(target, start, end)

用于从数组的指定位置拷贝元素到数组的另一个指定位置中。返回修改后的数组(即直接修改原数组),不会改变数组的长度。

  • target:目的起始位置
  • start:复制源的起始位置,可以省略,可以是负数。
  • end:复制源的结束位置,可以省略,可以是负数,实际结束位置是的索引(省略是数组length)。
var array = ['1', 'a', '2', 'b', 3, 'c']
array.copyWithin(3, 1, 5)  //['1', 'a', '2', 'a', '2', 'b']

array.every() 一个不通过返回false

方法使用指定函数检测数组中的所有元素:

  • 如果数组中检测到有一个元素不满足,则返回 false ,且剩余的元素不会再进行检测。
  • 如果所有元素都满足条件,则返回 true。
  • every() 不会对空数组进行检测。
  • every() 不会改变原始数组。
let ages = [32, 33, 16, 40];
ages.every(item => item > 18)

array.some() 一个通过就是true

方法使用指定函数检测数组中的所有元素:

  • 如果数组中检测到有一个元素满足,返回 true ,且剩余的元素不会再进行检测。
  • 如果所有元素都没有满足条件,则返回 false。
  • every() 不会对空数组进行检测。
  • every() 不会改变原始数组。
let ages = [32, 33, 16, 40];
ages.some(item => item > 18)

array.fill(value, start, end)

value	必需。填充的值。
start	可选。开始填充位置。
end	可选。停止填充位置 (默认为 array.length)

const arr = new Array(3).fill('ha'); // ['ha', 'ha', 'ha']
对像数组要注意,指定下标也是全改变

array.filter(fn)

常用操作,用于过滤元素,然后返回剩下的元素。传入的函数依次作用于每个元素,true 还是false

const arr = [1, 6, 9, 10, 100, 500,8]
const result = arr.filter(item => item % 2 === 0)
result // [6, 10, 100, 500, 8]

array.find(fn(currentValue, index, arr))

find()函数返回true,则停止迭代,并返回currentValue;如果没有搜索到,则返回undefined

  • 注意:在函数执行中添加数组不会被执行,但执行后的结果里是有的
let a = [1,2,3,4,5,6]
a.find((item, index) => {
    if(index == 0){
        a.push(10)
    }
    console.log(item) // 1、2、3、4、5、6
})
console.log(a) // [1, 2, 3, 4, 5, 6, 10]

let a = [1,2,3,4,5,6]
a.find((item, index) => {
    if(index == 0){
        a.pop()
    }
    console.log(item)  // 1、2、3、4、5、undefined
})
console.log(a) // [1, 2, 3, 4, 5]

array.findIndex(fn(currentValue, index, arr))

findIndex()函数是查找目标元素,找到就返回元素的位置,找不到就返回-1 同上

array.findLast(fn(currentValue, index, arr))

findLast()函数从后向前查找目标元素,找到就返回元素,找不到就返回undefined 同上

array.findLastIndex(fn(currentValue, index, arr))

findLastIndex()函数从后向前查找目标元素,找到就返回元素的位置,找不到就返回-1 同上

array.flat() - 拉平多维数组

flat() 方法会按照一个可指定的深度拉平数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回

arr2.flat()  // 默认1层 //过滤空数组
arr3.flat(2);   //指定层级2
arr4.flat(Infinity);  //无限层级 reduce 和 concat的结合版

array.flatMap(fn)

flatMap()可以理解为flatmap的结合体; flat对应的是扁平化功能; map对应的是对数组每个元素的操作功能;

array.forEach(fn(currentValue, index, arr), thisValue)

forEach适用于只是遍历,for则在较复杂的循环中效率更高,forEach无法中断循环,除非程序报错。

  • 基本类型的数据,无法更改
  • 引用数据类型的是可以更改的

array.includes(searchEl, fromIndex[省略为0])

includes() 方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false。

  • searchEl:可以传入一个数组 ['aa', 'bb', 'cc],是否包含 aa || bb || cc
  • fromIndex:大于等于数组长度,则返回 false;该数组不会被搜索。
  • 解决 indexOf的语义化NaN的匹配

array.indexOf(searchEl, fromIndex[省略为0])

一维数组元素中搜索指定对象,然后返回其首个匹配项的索引。 范围从指定索引到该数组结尾。

array.indexLashOf(searchEl, fromIndex[省略为0])

一维数组元素中从后向前搜索指定对象,然后返回其首个匹配项的索引。 范围从指定索引到该数组结尾从后向前数。

array.join() 数组转成字符串

将数组的元素连接转成字符串。字符串的元素将由指定的分隔符分隔,其默认值为(,)。

array.toLocaleString() - toString加强,本地符号分隔

[12345].toLocaleString()    // '12,345'

array.toString() - 返回给定数组的字符串形式

[1,2,3].toString()    // '1,2,3'

array.map(fn(currentValue,index,arr), thisValue)

  • map方法会返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
  • forEach方法返回值则永远是undefined。
[1,  2, 3].map(parseInt); // 1, NaN, NaN

array.reduce(callback, [initialValue]) - 迭加器 - 号称万能数组操作

callback (执行数组中每个值的函数,包含四个参数)

    1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
    2、currentValue (数组中当前被处理的元素)
    3、index (当前元素在数组中的索引)
    4、array (调用 reduce 的数组)

initialValue: `省略时为1,应该是0;空数组不加默认值会报错`
// 简单方法 数组求合,求乘积
const arr = [1, 2, 3, 4];
const sum = arr.reduce((x,y) => x+y)
const mul = arr.reduce((x,y) => x*y)
console.log( sum ); //10
console.log( mul ); //24
// 计算数组中每个元素出现的次数
const names = ['A', 'D', 'T', 'B', 'A'];
const nameNum = names.reduce((pre,cur) => {
  if(cur in pre) {
    pre[cur]++
  } else {
    pre[cur] = 1 
  }
  return pre
},{})
console.log(nameNum); //{A: 2, B: 1, T: 1, D: 1}
//数组去重
const arr = [1,2,2,4,4,1]
const newArr = arr.reduce((pre,cur) => {
    if(!pre.includes(cur)) {
      return pre.concat(cur)
    } else {
      return pre
    }
},[])
console.log(newArr);// [1, 2, 4]
// 将二维数组转化为一维
const arr = [[0, 1], [2, 3], [4, 5]]
const newArr = arr.reduce((pre,cur) => {
    return pre.concat(cur)
},[])
console.log(newArr); // [0, 1, 2, 3, 4, 5]

// 多维数组转化为一维
function Flat(arr = []) {
   return arr.reduce((t, v) => t.concat(Array.isArray(v) ? Flat(v) : v), [])
}
//获取数组中最大值和最小值
let arr = [3.24, 2.78, 999];
arr.reduce((x, y) => Math.max(x, y));
arr.reduce((x, y) => Math.min(x, y));

array.reduceRight(callback, [initialValue]) - 从后向前

同上 reduce()

array.pop() 删除最后一个元素

pop() 方法移除数组的最后一个元素,并返回该元素

array.shift() 删除第一个元素

shift() 方法移除数组的第一个元素,并返回该元素

array.push() 最后面添加

push() 方法向数组最后面添加元素

array.unshift() 最前面添加

unshift() 方法向数组最前面添加元素

array.slice(num1,num2) - 数组截取

可以截取数组的任意一端,并将截取到的数组返回,但需注意的是它并不改变原数组

  • num1:开始截取数组的位置(包含该位置的元素),如果内有传,则默认为0
  • num2:停止截取数组的位置(不包含该位置的元素),如果没有传,则默认值是数组的长度length。

array.splice(start, num, value...) - 插入、删除或替换元素

  • start——必须,整数,规定添加或者删除的位置,使用负数,从数组尾部规定位置。
  • num ——必须,要删除的数量,如果为0,则不删除项目。
  • value ——可选,向数组添加的新项目,删除0个就是插入。

array.reverse() - 数组反转

reverse() 方法反转数组中元素的顺序

array.sort() - 排序

arr.sort(function(a,b){
  return a-b; //从小到大
});

arr.sort(function(a,b){
  return b-a; //从大到小
});

array.entries() - 索引和键值 对比keys、values

用于获取一个新的Array,其中包含数组每个索引的键和值对。

let arr = ['a', 'b', 'c', 'd'];
var arr2 = arr.entries()
for (let e of arr2) {
     console.log(e)
   }
[0, 'a']
[1, 'b']
[2, 'c']
[3, 'd']

arr2.next().value 每一项都是数组

array.keys()

keys()方法创建并返回新的迭代器对象,它保存数组中每个索引的键。此方法不会影响原始数组。

array.values()

values()方法返回一个新的 Array Iterator 对象,该对象包含数组每个索引的值。

它们都返回一个遍历器对象,可以用for…of循环进行遍历,唯一的区别是 keys()是对键名的遍历、 values()是对键值的遍历, entries()是对键值对的遍历.


let arr = ['a', 'b', 'c']
for (let index of arr.keys()) {
console.log(index);
}
// 0
// 1
// 2
for (let item of arr.values()) {
console.log(item);
}
// 'a'
// 'b'
// 'c'
for (let [index, item] of arr.entries()) {
console.log(index, item);
}
// 0 'a'
// 1 'b'
// 2 'c'