数组操作(精简版)

128 阅读11分钟

日常开发中,数组对于我们来说是经常使用到的,由此这里给大家分享几十个关于Array实用的代码, 内容很多,建议收藏阅读

本篇文章不在一一解释,每个操作的具体用法,我们只介绍一下主要(实用)用法,让我们开始吧

1.0 push

push 方法从数组尾部开始添加数据,原数组发生改变

let a = [1,2,3]
a.push(4,5,6) // a = [1,2,3,4,5,6]  
 
let a = [1,2,3]
let b = a.push([1,2]) // a = [1,2,3,[1,2]] 

let a = [1,2,3]
a.push() // a = [1,2,3] 

2.0 unshift

unshift 方法从数组头部开始添加数据,原数组发生改变

let a = [1,2,3]
a.unshift(4,5,6) // a = [4,5,6,1,2,3]

let a = [1,2,3]
a.unshift([1,2]) // a = [[1,2],1,2,3] 

let a = [1,2,3]
a.unshift() // a = [1,2,3] 

3.0 pop

pop 方法来删除并返回数组的最后一个元素,原数组发生改变

let a = [1,2,3]
let b = a.pop() // a = [1,2]   b = 2

4.0 shift

shift 方法来删除并返回数组的第一个元素,原数组发生改变

let a = [1,2,3]
let b = a.shift() // a = [2,3]   b = 1

5.0 slice

slice 切割数组arr.slice(start, end):start和end是数组下标从0开始(允许负值),返回切割后的数组,原数组不改变

let a = [1,2,3]
let b = a.slice() // a = [1,2,3]   b = [1,2,3]

let a = [1,2,3]
let b = a.slice(1) // a = [1,2,3] b  = [2,3]

let a = [1,2,3]
let b = a.slice(1,2) // a = [1,2,3] b  = [2]

// 5.1 超过下标到最后一个结束
let a = [1,2,3]
let b = a.slice(1,5) // a = [1,2,3] b  = [2,3]

// 5.2 第一个参数为负数 倒着查即可
let a = [1,2,3,4]
let b = a.slice(-2) // a = [1,2,3,4] b  = [3,4]  

// 5.3 多个负数
let a = [1,2,3,4]
let b = a.slice(-2,2) // a = [1,2,3,4] b  = [] 负数 -2 从 3 开始,2 也是3 并且不能包括它 所以为[]
let c = a.slice(-2,3) // a = [1,2,3,4]  c = [3]
let d = a.slice(-3,-1) // a = [1,2,3,4]  c = [2,3]
let e = a.slice(-1,-4) // 这种乱的情况 返回 [] 

重点:传两个值则从 第一个参数下标开始到 第二个参数下标 之前结束,不包括第二个参数下标的值

6.0 splice

splice 方法也是修改数组的,99%原数组改变

// 6.1 没有参数的话返回空数组,原数组不变
let a = [1,2,3]
let b = a.splice() // a = [1,2,3]   b = []

// 6.2 一个参数 ,表示从 该参数索引开始截取,到数组结束,原数组是剩下的
let a = [1,2,3]
let b = a.splice(1) // a = [1]   b = [2,3]
// 也可是负数
let b = a.splice(-1) // a = [1,2]   b = [3]

// 6.3 两个参数 , 从第一个参数索引开始到,第二个参数表示的是长度意思是1 就截取一个 2 就截取2个
let a = [1,2,3]
let b = a.splice(0,1) // a = [2,3]   b = [1]
let b = a.splice(1,2) // a = [1]   b = [2,3]

// 6.4 三个参数以上的, 同上 ,后面的参数 就是往数组里面追加的,往原数组截取的位置开始追加 我们这里是a
let a = [1,2,3,4]
let b = a.splice(0,1,5) // a = [5,2,3,4]   b = [1]
let b = a.splice(1,2,5,6) // a = [1,5,6,4]   b = [2,3]

7.0 reverse

reverse 方法 颠倒数组中元素的顺序

let a = [1,2,3]
let b = a.reverse(); // a = [3,2,1] b = [3,2,1]

8.0 sort

sort 对数组进行排序

// 8.1 基础排序是 从第一位开始的排完之后才排第二个
let a = [1,3,12,21]
let b = a.sort(); // a = [1,12,21,3] b = [1,12,21,3] 

// 8.2 排序函数
let a = [1,3,12,21]
let c = a.sort(function(a,b){
return a - b; // 从小到大排序 a = [1,3,12,21] c = [1,3,12,21]
return b - a; // 从大到小  a = [21,12,3,1] c = [21,12,3,1]
}); 

9.0 join

join 方法 可以把数组转换成字符串

let a = [1,2,3]
let b = a.join(); // a = [1,2,3] b = '1,2,3'
let b = a.join('+'); // a = [1,2,3] b = 1+2+3
let b = a.join(''); // a = [1,2,3] b = '123'

10.0 concat

concat 方法属于字符串的方法,也可以用于数组拼接

let a = [1,2,3]
let b = a.concat(4,5,6); // a = [1,2,3] b = [1,2,3,4,5,6]

let a = [1,2,3]
let b = a.concat([4,5,6]); // a = [1,2,3] b = [1,2,3,4,5,6]

let a = [1,2,3]
let b = a.concat([4,5,6],[7]); // a = [1,2,3] b = [1,2,3,4,5,6,7]

11.0 indexOf()

indexOf() 也是字符串的方法,也可以用于数组查找

// 11.1 传一个参数的话,存在 就返回索引值 ,不存在就返回-1
let a = [1,2,3]
let b = a.indexOf(2); // a = [1,2,3] b = 1 

// 11.2 第二个参数也在的话,就是从第二个下标开始查询
let a = [1,2,3]
let b = a.indexOf(2,2); // a = [1,2,3] b = -1
let b = a.indexOf(2,1); // a = [1,2,3] b = 1

12.0 forEach()

forEach遍历数组,没有返回值或者说是返回值为undefined

let arr = [1,2,3]
arr.forEach((item,index,arr)=>{
    //item 为当前数组元素
    // index 为当前索引
    // arr 为本数组
})

13.0 map()

map() 遍历数组 用来接收一个返回值,创建一个新数组 ,不改变原数组

let a = [1,2,3]
let b = a.map((item,index,arr)=>{
return item*2;
})
// a = [1,2,3] b=[2,4,6]

14.0 filter()

filter() 遍历数组用来接收一个返回值,创建一个新数组 ,不改变原数组

let arr = [1,2,3,4]
let arr1 = arr.filter(function(item,index){
return item>=3
})
// arr = [1,2,3,4] arr1=[3,4]

15.0 some()

some() 检测数组中是否含有某一个值,返回一个布尔值,如果数组中有任意一个元素满足给定的条件,结果就为 true否则则为false。

let arr = [1,2,3,4]
let arr1 = arr.some(function(item,index){
return item>=3
})
// arr = [1,2,3,4] arr1=true

16.0 every()

every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供),返回一个布尔值,结果为 true或false。

let arr = [1,2,3,4]
let arr1 = arr.every(function(item,index){
return item>=3
})
// arr = [1,2,3,4] arr1=false

17.0 reduce()

reduce() 对数组中的所有元素调用指定的回调函数,该回调函数的返回值为累计结果。并且把返回值在下一次回调函数时作为参数提供。

语法: array.reduce(function(total, currentValue, currentIndex, item), initialValue)

let arr = [1,2,3,4]
let arr1 = arr.reduce(function(total,num){
   return total + num ;
})
// 注意: 如果不传 initialValue 则数组的第一位会成为 total 也就是说
// reduce 是从第二位开始 遍历的
// arr = [1,2,3,4] arr1=10

// 练习:
var arr1 = [1, 2, [3, 4]];  
arr1.reduce((acc, val) => acc.concat(val), []);
// acc就是 total 
// [] 就是 initialValue
// 则acc就是[] ,所以[].concat(1)=>[1].concat(2)=>[1,2].concat([3,4]) //  [1,2,3,4]

18.0 Array.from()

Array.from()方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组。
18.1 Array.from 返回一个真正的数组

let a = [1,2,3]
// 参数为数组,返回和原数组一样的数组
let b = Array.from(a) // a = [1, 2, 3]  b = [1, 2, 3]
b[2] = 4 // a = [1, 2, 3]  b = [1, 2, 4]
// 参数含空位
let c = Array.from([1, ,3]) // c = [1,undefined,3]

18.2 将字符串转为数组

let  str = 'hello world!';
console.log(Array.from(str)) // ["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d", "!"]

18.3 将Set结构的数据转换为真正的数组

let a = [1,2,3]
let set = new Set(arr)
let b = Array.from(set) // a = [1,2,3]  b = [1,2,3]

18.4 Array.from还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组

let a = [1,2,3]
let set = new Set(arr)
let b = Array.from(set, item => item + 1) // a = [1,2,3]  b = [2,3,4]

18.5Array.from可以将类数组对象,转为数组

那么什么是类数组对象呢?所谓类数组对象,最基本的要求就是具有length属性的对象

let arrayLike = {
    0: 'tom',
    1: '65',
    2: '男',
    3: ['jane','john','Mary'],
    'length': 4
}
let arr = Array.from(arrayLike) // arr =  ['tom','65','男',['jane','john','Mary']]

let arrayLike = {
    'name': 'tom',
    'age': '65',
    'sex': '男',
    'friends': ['jane','john','Mary'],
    'length': 4
}
let arr = Array.from(arrayLike) // arr= [ undefined, undefined, undefined, undefined ]

总结:要将一个类数组对象转换为一个真正的数组,必须具备以下条件:
1、该类数组对象必须具有length属性,用于指定数组的长度。如果没有length属性,那么转换后的数组是一个空数组。
2、该类数组对象的属性名必须为数值型或字符串型的数字 (ps: 该类数组对象的属性名可以加引号,也可以不加引号)

19.0 Array.of()

Array.of() 方法: 数组创建,将参数中所有值作为元素形成数组,如果参数为空,则返回一个空数组

let a = Array.of(1,2,3) // a = [1,2,3]
let b = Array.of(1,'2',true) // a = [1,'2',true]
let c = Array.of();// c []
let d = Array.of(1,'',' ',undefined,,2) // 这个是要报错的 参数不能为空(也就是里面的两个,,)

20.0 find()

find() 方法查找数组中符合条件的元素,若有多个符合条件的元素,则返回第一个元素。

let a = Array.of(1,2,3) // a = [1,2,3]
let b = a.find(item => item > 2) //b = 3

21.0 findIndex()

findIndex() 方法查找数组中符合条件的元素,若有多个符合条件的元素,则返回第一个元素索引。

let a = Array.of(1,2,3) // a = [1,2,3]
let b = a.findIndex(item => item === 1) //b = 0

22.0 includes()

includes()方法:检测数组中是否包含一个值

let a = [1,2,3]
let b = a.includes(1) //b = true
// 参数2:可选,搜索的起始索引,默认为0
let c = a.includes(1,2) //c = false
// NaN的包含判断
let d = [1,NaN].includes(NaN) // true

23.0 fill()

fill()方法:将一定范围索引的数组元素内容填充为单个指定的值

let a = [1,2,3]
// 参数1: 用来填充的值
// 参数2:被填充的起始索引
// 参数3(可选): 被填充的结束索引,默认为数组末尾
let b = a.fill(10,1,2) //a = [1,10,3] b = [1,10,3]
let b = a.fill(10,1) // a = [1,10,10] b = [1,10,10]

24.0 flat()

嵌套数组转一维 数组 (注意:兼容性很不好)

 console.log([1 ,[2, 3]].flat()); // [1, 2, 3]
// 指定转换的嵌套层数
console.log([1, [2, [3, [4, 5]]]].flat(2)); // [1, 2, 3, [4, 5]]
// 不管嵌套多少层
console.log([1, [2, [3, [4, 5]]]].flat(Infinity)); // [1, 2, 3, 4, 5]
// 自动跳过空位
console.log([1, [2, , 3]].flat()); // [1, 2, 3]

// 例外的:flatMap()方法:相当于array.map().flat()

25.0 isArray()

isArray()使用它可以判断一个值是否为数组。

let a = [1,2,3];
console.log(Array.isArray(a));  //true
let a = {name:'2'}
console.log(Array.isArray(a));  //false

26.0 ...

... 扩展运算符

let arr = [1, 2], arr1 = [...arr]; // arr = [1, 2] arr1 = [1, 2]
// 数组含空位
let arr2 = [1, , 3],
arr3 = [...arr2]; // arr3 = [1, undefined, 3]
// 合并数组
let a = [...[1,2], ...[3,4]] // [1,2,3,4]

接下里是一些关于数组操作的代码了:

1.0 将值转换为数组

let castArray = (value) => (Array.isArray(value) ? value : [value]);
castArray(1); // [1]

2.0 检查数组是否为空

 let isEmpty = (arr) => Array.isArray(arr) && arr.length === 0;
 isEmpty([]); // true

3.0 克隆一个数组

const clone = (arr) => arr.slice(0);

// Or
const clone = (arr) => [...arr];

// Or
const clone = (arr) => Array.from(arr);

// Or
const clone = (arr) => arr.map((x) => x);

// Or
const clone = (arr) => JSON.parse(JSON.stringify(arr));

// Or
const clone = (arr) => arr.concat([]);

4.0 将字符串数组转换为数字

 const toNumbers = (arr) => arr.map(Number);

// Or
const toNumbers = (arr) => arr.map((x) => +x);
toNumbers(['2', '3', '4']); // [2, 3, 4]

5.0 计算数组中某个值的出现次数

 const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a), 0);
// 展开:
 function countOccurrences(arr,val){
  return arr.reduce(function(total,item){
        return item === val ? total + 1 : total
   },0)
}

// Or
const countOccurrences = (arr, val) => arr.filter((item) => item === val).length;
// 展开:
function countOccurrences(arr,val){
   let oArr =  arr.filter(function(item,index){
        return item === val
    })
    return oArr.length
}
countOccurrences([2, 1, 3, 3, 2, 3], 2); // 2
countOccurrences(['a', 'b', 'a', 'c', 'a', 'b'], 'a'); // 3

6.0 计算数组元素的出现次数

const countOccurrences = (arr) => arr.reduce((prev, curr) => ((prev[curr] = ++prev[curr] || 1), prev), {});
// 展开:
var countOccurrences = function countOccurrences(arr) {
    return arr.reduce(function (prev, curr) {
        prev[curr] = ++prev[curr] || 1;
        return prev;
    }, {});
}; 
countOccurrences([2, 1, 3, 3, 2, 3]); // { '1': 1, '2': 2, '3': 3 }
countOccurrences(['a', 'b', 'a', 'c', 'a', 'b']); // { 'a': 3, 'b': 2, 'c': 1 }

7.0 计算数组中某个值的出现次数

 const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a), 0);
// 展开:
 var countOccurrences = function countOccurrences(arr,val) {
        return arr.reduce(function (num, item) {
            return item === val ? num +1 : num
        }, 0);
    };
   console.log(countOccurrences([2, 1, 3, 3, 2, 3], 2)) // 2
   console.log(countOccurrences(['a', 'b', 'a', 'c', 'a', 'b'], 'a')) // 3

8.0 清空数组

 const empty = (arr) => (arr.length = 0);

9.0 查找数组中最长字符串的长度

 const findLongest = (words) => Math.max(...words.map((el) => el.length));
// 展开:
  var findLongest = function findLongest(arrWords) {
       let OarrArrWords =  arrWords.map(el=>{
            return el.length
        })
      return  Math.max(...OarrArrWords)
    };
  console.log(findLongest(['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life'])) // 6

10.0 查找数组的最大项和最小项

 const max = (arr) => Math.max(...arr);
 const min = (arr) => Math.min(...arr);

11.0 获取数组的平均值

 const average = (arr) => arr.reduce((a, b) => a + b, 0) / arr.length;
// 展开:
 var average = function average(arr) {
      let Onum =  arr.reduce((a,item)=>{
           return a+item
       },0)
        return Onum / arr.length;
    };
    console.log(average([1,2,3])) // 2

12.0 删除数组中的重复值

onst removeDuplicate = (arr) => arr.filter((i) => arr.indexOf(i) === arr.lastIndexOf(i));
// 展开:
var removeDuplicate = function removeDuplicate(arr) {
          return arr.filter((i)=>{
             return arr.indexOf(i) === arr.lastIndexOf(i);// 返回正序出现的位置和倒叙出现的位置相同证明就这一个了
          })
        };
console.log(removeDuplicate(['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'])) // ['h', 'e', 'w', 'r', 'd']

13.0 从数组中删除假值

const removeFalsy = (arr) => arr.filter(Boolean);
removeFalsy([0, 'a string', '', NaN, true, 5, undefined, 'another string', false]);
// ['a string', true, 5, 'another string']

14.0 打乱数组

 const shuffle = (arr) => arr.sort(() => 0.5 - Math.random());
 shuffle([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); // [9, 1, 10, 6, 8, 5, 2, 3, 7, 4]

15.0 将数组拆分为块

 const chunk = (arr, size) => arr.reduce((acc, e, i) => (i % size ? acc[acc.length - 1].push(e) : acc.push([e]), acc), []);
// 展开:
 let  chunk  = function chunk(arr,size){
       arr.reduce((acc, currentValue, currentIndex)=>{ //currentValue 当前值,currentIndex,当前索引
          currentIndex % size ? acc[acc.length - 1].push(currentValue) : acc.push([currentValue]);
          return acc
       },[])
   }
   chunk([1, 2, 3, 4, 5, 6, 7, 8], 3); // [[1, 2, 3], [4, 5, 6], [7, 8]]
   chunk([1, 2, 3, 4, 5, 6, 7, 8], 4); // [[1, 2, 3, 4], [5, 6, 7, 8]]

16.0 创建笛卡尔积

 const cartesian = (...sets) => sets.reduce((acc, set) => acc.flatMap((x) => set.map((y) => [...x, y])), [[]]);
// 展开:
 function _toConsumableArray(arr) {
    if (Array.isArray(arr)) {
        for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
            arr2[i] = arr[i];
        }
        return arr2;
    } else {
        return Array.from(arr);
    }
}

var cartesian = function cartesian() {
    var _len = arguments.length;// 参数长度
    var sets = Array(_len);// 初始数组长度,都为空
    for (var _key = 0; _key < _len; _key++) {
        sets[_key] = arguments[_key]; // 赋值给sets
    }
    return sets.reduce(function (acc, set) {
        return acc.flatMap(function (x) {
            return set.map(function (y) {
                return [].concat(_toConsumableArray(x), [y]);
            });
        });
    }, [[]]);
};
console.log(cartesian([1, 2], [3, 4]))
// [ [1, 3], [1, 4], [2, 3], [2, 4] ]

不管活成什么样子,都不要把责任推给别人,一切苦乐都是自己造成的,任何一次选择,都有它对应的筹码,愿赌服输,也是一个成年人该有的品质。

qdysh.png