js-数组相关

Posted ……勇敢妞妞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js-数组相关相关的知识,希望对你有一定的参考价值。

数组

定义:
一般用于存放一组相同类型的数据,数组是一种数据类型

数组中的每一个数据叫做该数组中的元素

如何创建数组:
1.字面量/直接量创建=>快捷创建
var arr=[ ];

2.通过构造函数创建(官方提供的方法)
var arr=new Array();

注意:如果new array()括号里只接收一个参数且是数字类型时,会生成对应长度的空数组👇


数组的特性:

1.length属性,表长度:(数组元素的个数)
arr.length

2.可以通过下标取值和赋值
从0开始,下标最大取值是:length-1;

arr[0]—>arr[length-1]
下标就是索引,即元素的序号,
下标可以是变量或表达式。

取值取不到默认返回undefined
如果赋一个不存在的下标=>自动创建该下标并赋值,其他位置默认为empty。

3.可以被循环遍历(通过循环取得数组中的每一个值)

遍历数组for…in
1.返回数组的下标(字符串格式);
2.如果数组中有空余位置,也就是没有元素,则跳过,即不返回下标;

遍历数组for… of
1.返回数组的元素(值);
2.如果数组中有空余位置,也就是没有元素,则返回undefined;


七种数据类型
string number boolean null undefined array object

又分为两大类👇(节省内存)
1.值类型 (“hello”,1,true,false,null,undefined) 存在栈内存(一个萝卜一个坑)

2.引用类型 (array object 数组也是一个特殊格式的对象) 存在堆内存(对象都是引用类型,null除外)

浅复制 => 对于引用类型来说,直接通过=赋值,会使两个变量引用同一片内存空间 (=== 全等)
缺点:一个改变,另一个也随之改变

 var arr = [1, 2, 3];   // arr = [1, 2, 3];
 var brr = arr;         // brr = [1, 2, 3];
 brr.push(4);
 arr.push(5);
 console.log(arr, brr);  // [1, 2, 3, 4];   [1, 2, 3, 4];
 console.log(arr === brr);  // [1, 2, 3, 4];   [1, 2, 3, 4];

深复制 (拷贝)=> 得到一个与原数组元素相同的新数组
(1)新建数组,遍历原数组,将原数组的每一个元素放到新数组中
(2)借助数组的拓展方法slice() concat()

数组的递增赋值

利用下标的最大值等于length-1即length=下标最大值+1
arr[arr.length]在数组的尾部添加一个元素

   // var count = 0;
    // var arr = [];
    // arr[count++] = "a"; // arr[0] = "a", count+=1
    // arr[count++] = "b"; // arr[1] = "b", count+=2
    // arr[count++] = "c";
    // arr[count++] = "d";
    // console.log(arr);

    // 数组的递增赋值

    // 下标的最大值 = length -1   => length = 下标的最大值 + 1
    // arr[arr.length] 在数组的尾部添加一个元素

    var arr = [];  // len:0
    arr[arr.length] = "a"; // arr[0] = "a"  => len:1
    arr[arr.length] = "b"; // arr[1] = "b"  => len:2
    arr[arr.length] = "c"; // arr[2] = "c"  => len:3
    arr[arr.length] = "d"; // arr[3] = "d"  => len:4
    console.log(arr);
//案例:1-100中能被3或7整除的数 放到数组中
var arr=[];
for(i=1;i<=100;i++)
    if(i%3==0||i%7==0)
        arr[arr.length]=i;
    

console.log(arr);

数组的拓展方法(官方提供的操作数组的方法-数组的增删改查)
1.记住每个方法/函数的作用
2.每个方法的返回值
3.是否影响原数组

push()
在数组尾部新增一个或多个元素
返回值:新增数组后的长度
影响原数组
arr.push()

var arr=["a","b","c"];
console.log("原数组",arr);//["a", "b", "c"]
var result=arr.push("d","e");
console.log(result);//5
console.log(arr);// ["a", "b", "c", "d", "e"]

pop
在数组尾部删除一个元素
返回值:被删除的元素
影响原数组
arr.pop()

unshift()
在数组头部新增一个或多个元素
返回值:新增元素后数组的长度
影响原数组
arr.unshift()

var arr=["a","b","c"];
console.log("原数组",arr);//["a", "b", "c"]
var result=arr.unshift("1");
console.log(result);//4
console.log(arr);// ["1","a", "b", "c"]

shift()
在数组头部删除一个元素
返回值:被删除的元素
影响原数组
arr.shift()

splice数组任意位置增删改(影响原数组)

1.splice(startIndex,len)删除

从下标为startIndex开始的位置删除len个数,比如从第二个数往后删除2个数arr.splice(2,2);

返回值:被删除的元素形成的数组
影响原数组

var arr=["a","b","c"];
var result=arr.splice(2,1);
console.log(arr,result);

2.splice(startIndex,0,arg1,arg2…argN)新增
从下标为startIndex位置开始,删除0个元素,再新增一个或多个元素(从第三参数开始都是新增的元素)

返回值:被删除的元素形成的数组(没删=[ ])
影响原数组

3.splice(startIndex,len,arg1,arg2…argN)修改(删掉再新增)

reverse()数组翻转
返回值:反转后的原数组
影响原数组

sort()数组排序
返回值:排序后的原数组
是否影响原数组:影响

a.字符排序

var arr = [2, 8, 4, 11, "a", 6, "A", 5, 24, 7, 35, 9, 3, 1];
arr.sort();
console.log(arr);

默认按照ASCII字符码进行排序,数字式按照他们的字符串形式排序的。

b.纯数字排序 => sort中接收一个函数,用于指定排序的方式
怎么指定? 函数中有两个形式参数 分别代表比较的两个元素

var arr=[2,4,3,4,5,6,7,8,9,5,6,4]
arr.sort(function(a,b)
    //console.log(a,b);//分别代表比较的两个元素
    //return a-b;//a-b>0  =>前一个大于后一个时交换位置(从小到大)
     return b-a;//b-a>0  =>前一个小于后一个时交换位置(从大到小)
)
console.log(arr);

includes()数组中是否存在某个元素
返回值: 存在=>true
不存在=>false
不影响原数组

indexOf()返回某个元素在数组中第一次出现的位置
返回值:如果存在该元素=>下标
不存在=>-1
也可以用来做判断 数组中是否存在某个元素
存在 index != -1 index >= 0
不存在index == -1

不影响原数组

IndexOf(char,startIndex)也可以接收第二参数作为起始下标

var arr=["a","b","c","d","e"];
var char="x";
var index=-1;//假设不存在
for(var i=0;i<arr.length;i++)
    var item=arr[i];
    if(item===char)
        index=i;
        break;
    

console.log(index);//-1
模拟封装👇
function myIndexOf(arr, char) 
            // var arr = ["a", "b", "c", "d", "e"];
            // var char = "x";
            var index = -1;//假设不存在
            for (var i = 0; i < arr.length; i++) 
                var item = arr[i];
                if (item === char) //如果存在
                    index = i;//返回该元素下标,跳出for循环
                    break;
                
            
            // console.log(index);
            return (index);
        
        console.log(myIndexOf(["a", "b", "c", "d", "e"], "c"))

slice(startIndex,endIndex)数组裁切
从下标为startIndex位置开始,到endIndex位置结束,裁切后包含起始下标,不包含终止下标endIndex
1.常用于做前端分页(2000 =>每60一页)
2.得到一个与原数组元素相同的新数组=> (有些方法会影响原数组(push),如果想在不影响元素的情况下使用该方法 => 就可以把原数组先复制一遍,再使用)

返回值:被裁切的元素形成新数组
不影响原数组

slice() 也可以接收负数作为参数 (str.length - n)

 var arr = ["a", "b", "c", "d", "e"];
    var result = arr.slice();   //默认值  => 得到一个与原数组元素相同的新数组
    console.log(result);
    console.log(arr);

    // 模拟封装 mySlice()
    // function mySlice(arr, startIndex, endIndex) 
    //     // var arr = ["a", "b", "c", "d", "e"];
    //     // 默认值  !!!
    //     startIndex = startIndex == undefined ? 0 : startIndex; // 设置默认值
    //     endIndex = endIndex == undefined ? arr.length : endIndex; // 设置默认值

    //     var newArr = [];

    //     for (var i = startIndex; i < endIndex; i++) 
    //         var item = arr[i];
    //         newArr.push(item)
    //     
    //     return newArr;
    // 

concat()数组拼接
返回值:拼接后的新数组
不影响原数组

注意:拼接过程中如果遇到数组,就把数组展开(遍历数组),将数组中的每一个元素放到新数组,如果遇到的元素不是数组,直接放到新数组中

var arr = [1, 2];
    var brr = ["a", "b"];
    var crr = ["X", "Y"];

    var result = arr.concat(brr, crr, "hello", 100);
    console.log(result);
    console.log(arr, brr, crr);

1.一般用于多数组合并
2.得到一个与原数组元素相同的新数组=> (有些方法会影响原数组(push),如果想在不影响元素的情况下使用该方法 => 就可以把原数组先复制一遍,再使用)

join()用特定的字符将数组拼接形成字符串(char默认",")
返回值:拼接形成的字符串
不影响原数组

//思路
        var a = ["a", "b", "c", "d", "e"];
        var char = "-";
        var str = "";
        for (var i = 0; i < arr.length; i++) 
            var item = arr[i];
            if (i != arr.length - 1) 
                str += item + char;
             else 
                str += item;
            
        
        console.log(str);

join👇

  var a = ["a", "b", "c", "d", "e"];
  //var str = arr.join("-");//a-b-c-d-e
  //var str = arr.join("");//"abcde"
  var str = arr.join();//"a,b,c,d,e"
  console.log(str);

总结:增删改,翻转,排序会影响原数组
push,pop,unshift,shift,splice,reverse,sort
console.log(newStr);

https://www.runoob.com/jsref/jsref-obj-array.html更多数组方法

数组去重

去重方法1 splice删除重复 形成新数组,不影响原数组

数组坍塌:删除一个元素后,后面的元素会前移,占据删除元素的位置,所以新过来的元素也需要判断是否重复
数组坍塌可能有漏网之鱼,例如👇

解决办法:
1.j–,再判断一次
2.倒序判断就不会有坍塌了

去重方法2 创建一个新空白数组,遍历取值赋给空白数组

var arr=[1,2,3,1,2,3,12,2,3,45];
console.log("原数组" + arr);
var brr=[];//创建一个新数组
for(var i=0;i<=arr.length-1;i++)//遍历得到每个arr[i]
    if(brr.indexof(arr[i])==-1)//如果arr[i]不存在brr中,则新增到brr数组
        brr.push(arr[i]);
    

console.log("新数组" + brr);

去重方法3 concat拼接形成新数组

var arr=[1,2,3,1,2,3,12,2,3,45];
var brr=arr.concat();//拼接后形成一个新数组
for(var i=0;i<=brr.length-1;i++)//遍历得到每个brr[i]
   for(j=brr.length-1;j>=i+1;j--)//获取每一个brr[i]后的元素brr[j]
       if(brr[j]===brr[i])//恒等意味着数据类型也要一样
           brr.splice(j,1);//如果重复,则删掉
       
   
console.log("原数组" + arr);
console.log("新数组" + brr);

去重后元素统计👇


冒泡排序

原理:相邻的两个值作比较,不断地把大值放后边,执行多轮以后就排序完成(从小到大)

思路👇

每一轮👇

// 第一轮
    // 原数组:  [21, 63, 39, 43, 94, 77, 55]
    // 21 63  [21, 63, 39, 43, 94, 77, 55]
    // 63 39  [21, 39, 63, 43, 94, 77, 55]
    // 63 43  [21, 39, 43, 63, 94, 77, 55]
    // 63 94  [21, 39, 43, 63, 94, 77, 55]
    // 94 77  [21, 39, 43, 63, 77, 94, 55]
    // 94 55  [21, 39, 43, 63, 77, 55, 94]
    // =>  得到最大的放在最后面   
    var arr = [21, 63, 39, 43, 94, 77, 55];
    // debugger;
    for (var j = 0; j < arr.length - 1; j++) 
        // arr[j]; // 循环的当前值
        // arr[j + 1]; // 后一个值
        if (arr[j] > arr[j + 1])   // 如果当前值 大于 后一个 交换位置
            var temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        
    
    console.log(arr);
    

第一轮得到最大值在最后
第二轮得到倒数第二大数字放在倒数第二个位置



六轮之后👇

优化后代码👇

分析结果👇

最终优化:把多余次省掉,内层j<arr.length-1-i

var arr = [21, 63, 39, 43, 94, 77, 55];
    console.log("原数组:", arr);

    // 外层循环走一次  => 内层循环走一轮

    // i < arr.length - 1  ;  n个数比n-1次
    for (var i = 0; i < arr.length - 1; i++) //外层循环 => 控制总次数

        // j < arr.length - 1 , 最后一个数没有必要和后面比,排除
        for (var j = 0; j < arr.length - 1 - i; j++)   // 控制每次 做的详细操作
            // arr[j]; // 循环的当前值
            // arr[j + 1]; // 后一个值
            if (arr[j] > arr[j + 1])   // 如果当前值 大于 后一个 交换位置
                var temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            
        
        console.log(arr);

    

选择排序

原理:从第一个位置开始比较,不断找出最小的,不断和第一个位置互换,开始下一轮。

// 选择排序 (从小到大)

    // 第一轮 
    // 拿第一个值和后面所有的的值做比较,如果存在比第一个值还要小的数  交换两个数的位置
    // 1  [24, 38, 74, 12, 57, 26]
    //  =>  得到最小的值 放在 第一个位置

    var arr = [24, 1, 38, 74, 12, 57, 26];
    console.log("原数组", arr);

    // i<arr.length-1  最后一个没有必要和后面所有的比较
        for (var i = 0; i < arr.length - 1; i++) 
            // arr[i]   第几个
            // i+1 -> arr.length  后面所有的
            for (var j = i + 1; j < arr.length; j++) 
                if (arr[i] > arr[j]) 
                    var temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                
            
        
        console.log("新数组",arr);

判断一个数据是否是数组
instanceof()//判断
构造函数Array提供的一个方法Array.isArray();

	var arr = [1, 2, 3];   // new Array()
	var obj =  a: 1, b: 2 ;  // new Object()

	console.log(arr, typeof arr);
	console.log(obj, typeof obj);
    // 判断一个数据是否是数组?

    // instanceof  判断某个数据 是否是由 某个构造函数 创建的 (有些弊端,后续会继续补充)
    // console.log(arr instanceof Array);  // 判断arr是否是由构造函数Array创建的 
    // console.log(obj instanceof Object);  // 判断obj是否是由构造函数Object创建的 

    // 构造函数Array提供的一个方法 Array.isArray()
    // Array.isArray()  接收一个数据,如果是数组返回true 否则返回false
    // console.log(Array.isArray(arr));  // true
    // console.log(Array.isArray(obj));  // false
    // console.log(Array.isArray(1));  // false
    // console.log(Array.isArray(true));  // false

以上是关于js-数组相关的主要内容,如果未能解决你的问题,请参考以下文章

js 数组操作

JS最基础的数组知识

JS:ES5数组基本操作

js 类数组有push pop方法吗

JS删除指定下标的元素

js中push(),pop(),unshift(),shift()的用法小结