JavaScript数组以及重构

本文详细介绍了JavaScript数组的概念,包括其有序列表、紧密结构和无序元素的特性。讲解了数组的创建方式,如字面量、实例化、构造函数等。还探讨了数组的length属性、下标、元素以及遍历方法。文章进一步阐述了数组的修改方法,如push、pop、unshift、shift等,并介绍了concat、slice等不改变原始数组的操作。此外,还涉及了数组的排序、去重、查找和转换等高级操作。最后,提到了二维数组、静态方法Array.from和Array.isArray,以及sort()排序算法和错误处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组:数据驱动显示

定义:是一个无序元素的紧密结构的有序列表

1.有序列表:排序

2.紧密结构:列表是具备长度的,而且这个长度会自动根据列表内容变化而变化,添加删除消耗性能大,速度慢;

另外,可以遍历有对应的下标,可以根据下标遍历到数组的所有元素。

3.无序元素:意味着元素可以不区分先后顺序,而且不能避免重复

新建数组

1.字面量创建

数组长度不固定(在js中数组长度是可以改变的)

var arr = []

2.实例化创建(构造函数实例化)

var arr = new Array()

3.构造函数创建

var arr = Array()

4.通过对象创建数组

var arr = new Object([])

注意:如果使用实例化创建和构造函数创建数组,参数只有一个,并且是数值的话,那么这个数数值必须是正整数,如果有小数和负整数都会报错,这个正整数就是这个数组的预设长度,里面都放入空元素。则无法通过这种方式创建一个数值元素的数组。

arr. length:数组中元素的个数

下标:每个元素在数组中的位置,从0开始

下标变量:数组对应的下标的存储单元

元素:组成数组的最基本单元,叫做元素或者元,也叫做下标变量的值

可枚举判断:

key和value必须存在:for...in...

可以把数组作为对象枚举遍历时,数组中的下标就变为了对象的key属性,对象key属性就是字符串

注意:数组的长度length是不可枚举属性

for...in...最好不要作为数组遍历方式使用,会遍历到数组的所有属性,包括对象属性

迭代器遍历

for...of...(往返在一个上面改变)

数组复制

var arr = ['a','b',,'c',undefined,'e']
var arr1=[]
for(var i = 0;i < arr.length; i++){
    if(!(i in arr)) continue //枚举遍历,看第i项是否有key和value值,是一种判断空元素的方式
    arr1[i] = arr[i]
}

给数组尾部添加元素:arr[arr.length] = 值

替换数组的最头部元素:arr[0] = 值

arr.length:是一个可读可写不可删除不可枚举的属性

可写:如果长度比原来多,就在后面添加空属性,否则,将多出来的数据删除

arr,length = 0 清空数组 arr = []清空数组是错误的,会造成内存泄漏

arr.length -- :删除最后一个元素

注意:如果使用arr.length进行数组的添加和删除,则需要先将arr.length 赋值给一个新的变量,因为添加和删除时,长度在改变

数组的方法:

  1. push(数据1 ,数据2,数据3 ...)

function arrPush(arr){
            if(!arr || arr.constructor !== Array) throw new Error(arr +' is a not Array')
            for(var i = 1; i<arguments.length;i++){
                arr[arr.length]=arguments[i]
            }
            return arr.length
        }
  1. pop()

 function arrPop(arr){
            if(!arr || arr.constructor !== Array) throw new Error(arr + ' is a not Array')
            if(arr.length===0) return
            var item = arr[arr.length-1]
            arr.length--
            return item
        }
  1. unshift(数据1 ,数据2,数据3 ...)

 function arrUnshift(arr){
            if(!arr || arr.constructor !== Array) throw new Error(arr + ' is a not Array')
            var len = arguments.length-1
            if(!len) return arr.length
            for(var i = len+arr.length-1;i>=0;i--){
                if(i>=len) arr[i]=arr[i-len]
                else arr[i]=arguments[i+1]
            }
            return arr.length
        }
  1. shift()

function arrShift(arr) {
            if (!arr || arr.constructor !== Array) throw new Error(arr + ' is a not Array')
            if (arr.length === 0) return
            var item = arr[0]
            for (var i = 0; i < arr.length - 1; i++) {
                arr[i]=arr[i+1]
            }
            arr.length--
            return item
        }
  1. fill(要填充的数据,开始索引,结束索引)

function arrFill(arr,value,start,end){
            if(!arr || arr.constructor !== Array) throw new Error(arr+' is a not Array')
            if(isNaN(start)) start = 0
            if(isNaN(end)) end = arr.length
            start = Number(start)
            end = Number(end)
            if(start<0) start = start+arr.length<0 ? 0: start+arr.length
            if(end<0) end = end + arr.length < 0 ? 0:end+arr.length
            if(end>arr.length) end=arr.length
            for(var i = start;i<end;i++){
                arr[i]=value
            }
            return arr
        }
  1. concat(数据1/数据1,数据2/数组2...)

function arrayConcat(arr){
            if (!arr || arr.constructor !== Array) throw new Error(arr + "is not Array!");
            var array=[];
            for(var i=0;i<arguments.length;i++){
                if(arguments[i] && arguments[i].constructor===Array){
                    for(var j=0;j<arguments[i].length;j++){
                        array[array.length]=arguments[i][j];
                    }
                }else{
                    array[array.length]=arguments[i];
                }
            }
            return array;
        }
  1. slice(开始索引,结束索引)

function arraySlice(arr, start, end) {
            if (!arr || arr.constructor !== Array) throw new Error(arr + 'not a Array')
            start = ~~start
            end=~~end
            if (start < 0) start = start + arr.length < 0 ? 0 : start + arr.length
            if (end < 0) end = end + arr.length < 0 ? 0 : end + arr.length
            if(end > arr.length) end = arr.length
            var arr1 = []
            for(var i = start; i < end ;i++){
                arr1[arr1.length] = arr[i]
            }
            return arr1
        }
  1. indexOf(要查找的数据,开始的位置)

function arrayIndexOf(arr,item,start){
            if (!arr || arr.constructor !== Array) throw new Error(arr + 'not a Array')
            start = ~~start
            if(start < 0) start = start + arr.length < 0 ? 0 : start + arr.length
            for(var i = start; i < arr.length; i++){
                if(!(i in arr)) continue
                if(arr[i] === item) return i
            }
            return -1
        }
  1. lastIndexOf(要查找的数据,开始的位置)

function arrayLastIndexOf(arr,value,end){
            if (!arr || arr.constructor !== Array) throw new Error(arr + 'not a Array')
            if(end === undefined) end=arr.length-1
            end = ~~end
            if(end < 0) end = end+arr.length < 0? 0:end+arr.length
            for(var i =end;i>=0;i--){
                if(!(i in arr)) continue
                if(arr[i] ===value) return i
            }
            return -1
        }
  1. splice(开始索引,多少个,数据1,数据2...)

 function arraySplice(arr, start, deleteCount) {
            if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array");
            if (start === undefined) return [];
            start = ~~start;
            if (start < 0) start = (start + arr.length) < 0 ? 0 : start + arr.length;
            if (deleteCount === undefined) deleteCount = arr.length - start;
            deleteCount = ~~deleteCount;
            if (deleteCount < 0) deleteCount = 0;
            if (deleteCount + start > arr.length) deleteCount = arr.length - start;
            var arr1 = [];
            for (var i = start; i < arr.length; i++) {
                if (i < start + deleteCount) arr1[arr1.length] = arr[i];
                arr[i] = arr[i + deleteCount];
            }
            arr.length -= deleteCount;
            var len = arguments.length - 3;
            if (len <= 0) return arr1;
            for (var j = arr.length - 1 + len; j >= start; j--) {
                if (j >= start + len) arr[j] = arr[j - len];
                else arr[j] = arguments[3 + j - start];
            }
            return arr1;
        }
  1. reverse()

function arrayReverse(arr) {
            if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array");
            var len = ~~(arr.length/2);
            for (var i = 0; i < len; i++) {
                if (!(i in arr)) continue;
                var temp=arr[i]
                arr[i]=arr[arr.length-1]
                arr[arr.length-1]=temp
            }
            return arr;
        }
  1. join()

 function arrayJoin(arr,sep){
            if (!arr || arr.constructor !== Array) throw new Error(arr + 'not a Array')
            if(sep === undefined) sep =','
            sep = String(sep)
            var str = ''
            for(var i = 0 ; i < arr.length ; i++){
                if(i === arr.length -1) return str += arr[i]
                str += arr[i]+sep
            }
        }
  1. includes(要查找的数据)

 function arrayIncludes(arr,value){
            if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array");
            for(var i = 0; i < arr.length; i++){
                if(!(i in arr)) continue
                if(value===arr[i]) return true
            }
            return false
        }
  1. reduce(function(value,item,index,arr),value的初始值)

function arrayReduce(arr,fn,initValue){
            if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array");
            var i=0;
            if(initValue===undefined){
                initValue=arr[0];
                i=1;
            }
            for(;i<arr.length;i++){
               initValue=fn(initValue,arr[i],i,arr);
            }
            return initValue;
        }
function arrayReduceRight(arr,fn,initValue){
            if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array");
            var i=arr.length-1;
            if(initValue===undefined){
                initValue=arr[arr.length-1];
                i--;
            }
            for(;i>=0;i--){
               initValue=fn(initValue,arr[i],i,arr);
            }
            return initValue;
        }
  1. forEach(function(item,index,arr){})

function arrayForEach(arr, fn) {
            if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array");
            for (var i = 0; i < arr.length; i++) {
                if (!(i in arr)) continue;
                fn(arr[i], i, arr)
            }
        }
  1. map(function(item,index,arr){})

function arrayMap(arr, fn) {
            if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array");
            var arr1 = [];
            for (var i = 0; i < arr.length; i++) {
                if (!(i in arr)) continue;
                arr1[i]=fn(arr[i], i, arr)
            }
            return arr1;
        }
  1. filter(function(item,index,arr){})

function arrayFilter(arr, fn) {
            if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array");
            var arr1 = [];
            for (var i = 0; i < arr.length; i++) {
                if (!(i in arr)) continue;
                if (fn(arr[i], i, arr)) arr1.push(arr[i]);
            }
            return arr1;
        }
  1. every(function(item,index,arr){})

function arrayEvery(arr, fn) {
            if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array");
            for (var i = 0; i < arr.length; i++) {
                if (!(i in arr)) continue;
                if (!fn(arr[i], i, arr)) return false;
            }
            return true;
        }
  1. some(function(item,index,arr){})

function arraySome(arr, fn) {
            if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array");
            for (var i = 0; i < arr.length; i++) {
                if (!(i in arr)) continue;
                if (fn(arr[i], i, arr)) return true;
            }
            return false;
        }
  1. find(function(item,index,arr){})

function arrayFind(array,fn){
                if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array");
                for(var i=0;i<arr.length;i++){
                    if(!(i in arr)) continue;
                    if(fn(arr[i],i,arr)) return arr[i];
                }
        }
  1. findIndex(function(item,index,arr){})

function arrayFindIndex(array, fn) {
            if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array");
            for (var i = 0; i < arr.length; i++) {
                if (!(i in arr)) continue;
                if (fn(arr[i], i, arr)) return i;
            }
            return -1;
        }
  1. flatMap(function(item,index,arr){})

function arrayFlatMap(array,fn){
                if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array");
               var arr1=[];
                for(var i=0;i<arr.length;i++){
                    if(!(i in arr)) continue;
                //    arr1=arr1.concat(fn(arr[i],i,arr))
                    var item=fn(arr[i],i,arr);
                    if(item && item.constructor===Array){
                        for(var j=0;j<item.length;j++){
                            arr1.push(item[j]);
                        }
                    }else{
                        arr1.push(item);
                    }
                }
                return arr1;
        }
  1. flat(要拍平几层)

function flatMap(arr,target){
            if(target===undefined) target=[];
            for(var i=0;i<arr.length;i++){
                if(arr[i] && arr[i].constructor===Array){
                    flatMap(arr[i],target);
                }else{
                    target.push(arr[i]);
                }
            }
            return target;
        }
  1. sort()/sort(function(item,index,arr){})

function arraySort(arr,fn){
    if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array");
    for(var i=0;i<arr.length-1;i++){
        for(var j=0;j<arr.length-1-i;j++){
            if(arr[j]>arr[j+1]){
                var temp=arr[j]
                arr[j]=arr[j+1]
                arr[i]=temp
            }
        }
        if(arr[j]===arr[j+1]) i++
    }
    return arr
}
  1. copyWithIn(目标位置,开始索引,结束索引)

数组方法归纳

1.改变原数组:

push(),pop(),unshift(),shift(),splice(),reverse(),sort(),fill(),copyWithin(),

2.不改变原始数组

concat(),slice(),map(),filter(),flat(),flatMap(),

数组元素计数:

var obj={}
for(var i=0;i<arr.length;i++){
    if(!(i in arr)) continue
    if(!obj[arr[i]]) obj[arr[i]]=0
    obj[arr[i]]++
}

数组去重

1.改变原始数组

for(var i=0;i<arr.length;i++){
    for(var j=0;j<arr.length;){
        if(arr[i]===arr[j]) arr.splice(j,1)
        j++
    } 
}

2.不改变原始数组

var arr1=[]
YYH:for(var i=0;i<arr.length;i++){
    for(var j=0;j<arr.length;j++){
        if(arr[i]===arr[j]) continue YYH
    }
    arr1.push(arr[i])
}
var arr2=[]
for(var i=0;i<arr.length;i++){
    if(!(~arr2.indexOf(arr1[i]))) arr2.push(arr[i])
    //if(arr2.indexOf(arr1[i])===-1) arr2.push(arr[i])
    //if(!arr2.includes(arr1[i])) arr2.push(arr[i])
}

3.将两组数据相同的数据取出来

var arr3=[]
for(var i=0;i<arr.length;i++){
    if(arr1.includes(arr[i])&&!arr3.include(arr[i])) arr3.push(arr[i])
}

4.将两组数据不同的取出来

//先将数组去重
function difer(arr){
    for(var i=0;i<arr.length;i++){
        for(var j=0;j<arr.length;){
            if(arr[i]===arr[j]) arr.splice(j,1)
            j++
        }
    }
    return arr
}
//将数组的用对象的方式保存
function getCountObj(arr){
    var obj={}
    for(var i=0;i<arr.length;i++){
        if(!(i in arr)) continue
        if(!obj[arr[i]]) obj[arr[i]]=0
        obj[arr[i]]++
    }
    return obj
}
var newArr=[]
//将两个数组去重后连接起来
arr = difer(arr).concat(difer(arr1))
//将连接起来的数据转换为对象
var obj=getCountObj(arr)
for(var i=0;i<arr.length;i++){
    if(!(i in arr)) continue
    if(obj[arr[i]]>1) continue
    newArr.push(arr[i])
} 

try...catch..finally

try不管执行了多少,只要遇到错误,就会执行catch语句,try还是有效,只是不会报错了,而不管报错与否,都会执行finally语句

可以通过try..catch语句来中断forEach()循环

注意:throw必须用在函数里面

数组的静态方法

1.Arrayfrom()

参数1:迭代器

参数2:函数(跟map的功能一致)

2.Array.isArray():判断某个元素是不是数组

sort()排序

1.冒泡排序

for(var i=0;i<arr.length-1;i++){
    for(var j=0;j<arr.length-1-i;j++){
        if(arr[j]>arr[j+1]){
            var temp=arr[j]
            arr[j]=arr[j+1]
            arr[i]=temp
        }
    }
    if(arr[j]===arr[j+1]) i++
}

2.选择排序

for(var i=0;i<arr.length;i++){
    var min=i;
    for(var j=i+1;j<arr.length;j++){
        if(arr[j]<arr[min]) min=j
    }
    if(min!==i){
        var temp=arr[min]
        arr[min]=arr[i]
        arr[i]=temp
    }
    if(arr[i]===arr[i+1]) i++
}

3.快速排序

function quickSort(arr){
    if(arr.length<=1) return arr;
    var centerIndex=~~(arr.length/2)
    var left=[]
    var right=[]
    for(var i=0;i<arr.length;i++){
        if(i===centerIndex) continue
        if(arr[i]<arr[centerIndex]) left.push(arr[i])
        else right.push(arr[i])
    }
    return quickSort(left).concat(arr[centerIndex],quickSort(right))
}

二维数组

二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,类型说明符 数组名 [常量表达式] [常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称为方阵。对称矩阵 a[i] [j] = a[j] [i] [对角矩阵]:n阶方阵[主对角线]外都是零元素

对象数组

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值