JavaScript - Day06 - 数组

一、概念

1.一个变量存储多个数据:对象中可以通过键值对存储多个数据,且数据的类型是没有限制的

2.跟对象的区别:

                  对象无序 - 对象有小空间名称

                  数组有序 - 数组有小空间编号

二、定义

1.这是一个空数组,定义带数据的数组:var arr = [ ]  

2.数组中可以存储多个不同类型的数据,只是我们在项目中使用的时候,一般是将同类型数据存储在数组中

var arr = [12, 'abc', true]

3.js还提供了一个构造函数,用来创建数组:

              var arr = new Array()

这两种方式定义的数据是一样的。

有一种情况,这两种定义方式是不一样的:当只放一个数字n的时候,new表示有n个空的小空间,[]表示有一个空间放入了n

var arr = new Array(5) // 有5个空的小空间
console.log(arr);
var arr = [5] // 有1个小空间,里面存放了数字5
console.log(arr);

三、数组的基本操作

1.访问数组中的元素 ----- 数组[下标]

      1-1.下标

       数组这种数据,相当于在一个大空间中,有很多小空间,每个值前面的数字,表示这个小空间的编号,专业术语叫下标。第一个下标永远是0,依次向后递增,最后一个下标是值的个数-1,也就是说,数组这种数据中每个值是有顺序的

var arr = ['a', 'b', 'c']
console.log(arr);

2.设置数组中的元素 ---- 数组[下标] = 值

      (1)如果下标是已经存在的,那赋值操作就是修改数组元素的值;

      (2)如果下标是不存在,那赋值操作就给数组添加元素。

      (3)下标比最大的下标要大很多,会创建很多空的小空间

var arr = ['a', 'b', 'c']
arr[1] = 'd' // 替换下标为2的元素b为d
console.log(arr); 
arr[3] = 'e' // 给数组添加下标为3的元素e
arr[10] = 'f' // 下标比原数组下标大就会创建空的小空间,导致长度会变长
 

3.删除数组中的元素 ---- delete 数组[下标] 

       这种删除方式,只能删除值,并不能删除小空间

var arr = ['a', 'b', 'c']
delete arr[1]
console.log(arr);

4.操作数组中元素个数

    (1)获取数组中元素个数(也可以理解为数组的长度)

                   数组.length

                  console.log(arr.length);

    (2)设置数组长度

var arr = ['a', 'b', 'c']
arr.length = 2 // 会把第三个元素的c截掉
arr.length = 20 // 会多17个空的小空间
console.log(arr);
// 第一个元素的下标一定是0,最后一个元素的下标一定是 length-1

练习:

// 如何删除崔五并将总体长度从后减1?
// 思路:将下标4后面的所有元素向前移动一位,将长度设置为长度-1
var arr = ['牛一', '冷二', '卢三', '谢四', '崔五', '王六', '李七']
arr[4] = arr[5]
arr[5] = arr[6]
arr.length = arr.length - 1
console.log(arr);

// 如何添加张八到第三个?
var arr = ['牛一', '冷二', '卢三', '谢四', '崔五', '王六', '李七']
arr[7] = arr[6]
arr[6] = arr[5]
arr[5] = arr[4]
arr[4] = arr[3]
arr[3] = '张八'
console.log(arr);

四、遍历

1.for(var a = 0; a < arr.length; a++) { arr[a] }  ----  空的空间会遍历出undefined

2.for(var key in arr){ }  ----  空的空间不会被遍历

       多次输出是在进行重复动作,并且多次重复之间是有规律可循的,所以可以使用循环进行这个重复动作,这种使用循环将数组中每个元素输出的操作叫做数组的遍历 - 每个元素都经历一次

// 普通写法:将这七个人依次输出
var arr = ['牛一', '冷二', '卢三', '谢四', '崔五', '王六', '李七']
console.log( arr[0] );
console.log( arr[1] );
console.log( arr[2] );
console.log( arr[3] );
console.log( arr[4] );
console.log( arr[5] );
console.log( arr[6] );

// 循环写法:将这七个人依次输出
var arr = ['牛一', '冷二', '卢三', '谢四', '崔五', '王六', '李七']
for(var a=0; a<=6; a++) {
    console.log( arr[a] );
}

        数组属于object类型,for in 这种也可以遍历数组,虽然也能遍历数组,但是不会遍历空的小空间 - 建议使用 a=0的方式来遍历数组

        for in的语法更适合遍历对象,为了避免不必要的错误,尽量不要用这种语法来遍历数组。

// 从下标为0开始遍历写法:将这七个人依次输出
var arr = ['牛一', '冷二', '卢三', '谢四', '崔五', '王六', '李七']
arr[10] = '李好呀'
console.log(arr);
for(var a=0; a<arr.length; a++) {
    console.log( arr[a] );
}
// 空的空间会遍历出undefined


// for in遍历写法:将这七个人依次输出
var arr = ['牛一', '冷二', '卢三', '谢四', '崔五', '王六', '李七']
arr[10] = '李好呀'
console.log(arr);
for(var a in arr) {
    console.log(a, arr[a]);
}
// 空的空间不会被遍历

练习:根据数组渲染页面

<head>
    <meta charset="UTF-8">
    <style>
    .goods{
        float: left;
        width: 280px;
        margin:0 5px;
    }
    .goods img{
        border-right: 1px solid #ccc;
    }
    .goods:last-child img{
        border: none;
    }
    .goodsname{
        width: 280px;
        overflow: hidden;
        white-space: nowrap;
        text-overflow: ellipsis;
    }
    .price{
        color: red;
    }
    </style>
    <title>Document</title>
</head>
<body>
</body>
<script>
var arr = [
    {
        name: '欧臻廷保湿修护亮颜银霜面霜70ml护肤品化妆品乳液滋润送女友礼物礼盒款',
        price: '1380.00',
        imgpath: 'https://img20.360buyimg.com/seckillcms/s280x280_jfs/t1/155703/22/35655/57123/63fef24aF171c95c4/e7f04f1ab27e0e6f.jpg.avif'
    },
    {
        name: 'Redmi K50Pro 天玑9000 AMOLED 2K柔性直屏 OIS光学防抖  120W快充 幻镜  8GB+256GB 5G智能手机 小米红米',
        price: '2619.00',
        imgpath: 'https://img30.360buyimg.com/seckillcms/s280x280_jfs/t1/107510/22/22861/98537/628ca5caE4a4fa7e4/d29d2f7bea40b3bb.jpg.avif'
    },
    {
        name: '卡诗(KERASTASE)黑钻钥源鱼子酱洗发水250ml 改善毛躁呵护受损',
        price: '219.00',
        imgpath: 'http://img11.360buyimg.com/seckillcms/s280x280_jfs/t1/109242/28/23835/49558/622afda5E603886a6/218e712f7c69864d.jpg.avif'
    }
]
for(var a = 0; a < arr.length; a++) {
    var obj = arr[a]
    var imgpath = obj.imgpath
    var name = obj.name
    var price = obj.price
    document.write('<div class="goods">')
        document.write('<img src="'  +  imgpath  +   '" alt="">');
        document.write('<p class="goodsname">'+name+'</p>');
        document.write('<p class="price">¥<span>'+price+'</span></p>');
    document.write('</div>');

}
</script>

五、基础类型和引用类型

1.基础/简单类型

         number/string/boolean/undefined/null

         存储:直接将具体数据存储在栈内存中

         赋值:将具体的数据复制给另一个变量

var a = 1
var b = a
a = 2
console.log(b);

         比较:比较的是具体的数据以及类型

var a = 1
var b = '1'
console.log(a == b); // 直接比较具体数据,忽略类型
console.log(a === b); // 先比较类型,类型相同了再比较具体数据

2.引用/复杂类型

         object/array/function

         存储:将具体数据存储在堆内存中,将堆内存中的内存地址存储在栈内存中

         赋值:将堆中的地址复制给另一个变量 - 导致两个变量共享同一个数据

// 存储
var arr = [1,2,3]
var brr = arr
arr = [4,5,6]
console.log(arr); // a输出456,因为a第二次赋值覆盖第一次赋值
console.log(brr); // b输出123

// 赋值
var arr = [1,2,3]
var brr = arr
arr[0] = 'a'
console.log(brr);

         比较:比较内存地址是否相同

// 比较
var arr = [1,2,3]
var brr = [1,2,3]
console.log(arr == brr);  // false
console.log(arr === brr); // false

六、数组方法

1.改变原数组

     1-1.数组的增删操作

           (1)unshift:给数组开头添加一个或多个元素

                    语法:数组.unshift(1个或多个元素) - 返回新数组的长度

    // unshift - 给数组开头添加一个或多个元素 - 返回数组新长度
    var arr = ['a','b','c']
    var brr = arr.unshift('d')
    console.log(arr);
    console.log(brr);

           (2)shift:将数组的第一个元素删掉

                    语法:数组.shift() - 返回被删掉的元素

    // shift - 删除数组的第一个元素 - 返回被删掉的元素
    var arr = ['a','b','c']
    var brr = arr.shift();
    console.log(arr);
    console.log(brr);

           (3)push:给数组末尾添加一个或多个元素

                    语法:数组.push(1个或多个元素) - 返回新数组长度

    // push - 给数组的末尾添加一个或多个元素 - 返回数组新长度
    var arr = [1,2,3];
    var brr = arr.push(4);
    console.log(arr);
    console.log(brr);

           (4)pop:删除数组的最后一个元素

                    语法:数组.pop() - 返回被删掉的元素

    // pop - 删除数组最后一个元素 - 返回被删掉的元素
    var arr = [1,2,3];
    var brr = arr.pop();
    console.log(arr);
    console.log(brr);

           (5)splice:在数组的任意一个位置 添加、删除、修改 1个或多个元素

                    语法:数组.splice(开始下标, 要删除的元素个数, 在删除位置要放进去的1个或多个元素) - 返回所有被删除的元素组成的数组

    // splice - 对数组做增、删、改的操作
    // 添加
    var arr = ['a','b','c'];
    var brr = arr.splice(1,0,'d');
    console.log(arr);
    console.log(brr);
    
    // 删除
    var arr = ['a','b','c'];
    var brr = arr.splice(1,1);
    console.log(arr);
    console.log(brr);

    // 修改
    var arr = ['a','b','c'];
    var brr = arr.splice(1,1,'d');
    console.log(arr);
    console.log(brr);

     1-2.其他

           (1)reverse:翻转数组

                    语法:数组.reverse() - 返回翻转后的数组

    // reverse - 数组的反转
    var arr = [1,2,3];
    console.log(arr);    
    var brr = arr.reverse();
    console.log(brr);

           (2)sort:排序

                    语法:数组.sort() - 进行了升序排列,默认使用字符串规则进行排列 - 返回排序后数组

    // sort - 数组的排序
    // 正序
    var arr = [9,5,3,7,1,6,4,8,2];
    console.log(arr)
    var brr = arr.sort()
    console.log(brr)
    
    // 正序
    var arr = [9,5,3,7,1,6,4,8,2];
    console.log(arr)
    var brr = arr.sort(function(a,b){
        return a-b;
    })
    console.log(brr);
    // 倒序
    var brr = arr.sort(function(a,b){
        return b-a;
    })
    console.log(brr);

2.不改变原数组

     1-1.参数是基础数据

           (1)concat:将1个或多个 元素或数组 合并成一个更大的数组

                    语法:数组.concat(1个或多个元素或数组) - 返回更大的新数组

    // concat - 数组的拼接
    var arr = [1, 2, 3]
    var brr = arr.concat(4)
    console.log(arr);
    console.log(brr);
    var brr = arr.concat(4, 5, 6)
    console.log(brr);

    var arr = [1, 2, 3]
    var brr = [4, 5, 6]
    var crr = [7, 8, 9]
    var drr = arr.concat(brr, crr)
    console.log(drr);

           (2)slice:从数组中截取出其中一部分 - 包前不包后

                    语法:数组.slice(开始下标, 结束下标) - 返回截取出来的那一部分组成的数组

    // slice - 截取数组 ---- 包前不包后
    var arr = ['a','b','c','d','e','f'];
    console.log(arr)
    var brr = arr.slice(1,4)
    console.log(brr)
    console.log(arr === brr); // false

    var crr = arr.slice(1) // 省略第二个参数就默认截取到数组末尾
    console.log(crr)
    console.log(arr === brr); // false

    var drr = arr.slice() // 两个参数都不加,就会从开头截取到末尾
    console.log(drr)
    console.log(arr === brr); // false

           (3)indexOf:查找元素在数组中第一次出现的下标

                    语法:数组.indexOf(元素) - 找到了就返回下标,找不到返回-1

    var arr = ['a','b','c','a','d']
    console.log(arr.IndexOf('a'))

                            我们通常会利用找到和找不到的返回值不同,来判断一个元素是否在数组中

                            语法:数组.indexOf(元素, 开始下标) - 从开始下标开始向后找元素第一次出现的下标

    var arr = ['a','b','c','a','d']
    console.log(arr.indexOf('a',1))

           (4)lastIndexOf:查找元素在数组中最后一次出现的下标

                    语法:数组.lastIndexOf(元素) - 找到了就返回下标,找不到返回-1

    var arr = ['a','b','c','a','d']
    console.log(arr.lastIndexOf('a'))

                           我们通常会利用找到和找不到的返回值不同,来判断一个元素是否在数组中

                           语法:数组.lastIndexOf(元素, 下标) - 将指定下标当做数组的结尾,找元素在数组中最后一次出现的下标

    var arr = ['a','b','c','a','d']
    console.log(arr.lastIndexOf('a',1))

           (5)join:使用指定的连接符将数组中每个元素连接成一个字符串

                    语法:数组.join(连接符) - 返回字符串

    var arr = ['a','b','c'];
    console.log(arr)
    var brr = arr.join('-');
    console.log(brr)

    var arr = ['a','b','c'];
    console.log(arr)
    var brr = arr.join(); // 不指定连接符默认使用逗号连接
    console.log(brr)

    var arr = ['a','b','c'];
    console.log(arr)
    var brr = arr.join(''); // 将所有元素合在一起
    console.log(brr)

     1-1.数组的增删操作

           (1)forEach:用于遍历数组,这个方法没有返回值,返回值为undefined,不会改变原来数组的值。

                    语法:数组.forEach(function(value, index, array) {

                                           value - 代表遍历出来的每个元素

                                           index - 代表每个元素的下标

                                           array - 代表当前正在遍历的这个数组

                                           })

    // forEach只能从头到尾遍历
    // forEach不遍历空元素
    var arr = ['a', 'b', 'c']
    arr[5] = 'd'
    console.log(arr)

    arr.forEach(function (value, index, array) {
        console.log(value, index, array);
        // if(index === 1) {
        //     break // forEach中不能使用break
        // }
    })

           (2)filter:将数组中满足指定条件的元素都组成一个新的数组并返回,使用方法和功能跟map方法很像,只是运行规则不一样。map方法中的函数,用于返回新的元素,而filter方法中的函数,根据返回true或false来筛选元素

                    语法:var brr = 数组.filter(function(value, index, array) {

                                           value - 代表遍历出来的每个元素

                                           index - 代表每个元素的下标

                                           array - 代表当前正在遍历的这个数组

                                           return 条件

                                           })

    var arr = [1,2,3,4,5,6];
    console.log(arr)
    var brr = arr.filter(function(v,index){
        return v>1
    })
    console.log(brr) // [2,3,4,5,6]

    var arr = [1,2,3,4,5,6];
    console.log(arr)
    var brr = arr.filter(function(v,index){
        return v>8
    })
    console.log(brr) // []

           (3)map:将数组中每个元素都处理成新的元素,所有新的元素组成新的数组返回,这个方法主要用于以同样的规则处理数组中的每个值,并组成新的数组返回

                    语法:var brr = 数组.map(function(value, index, array) {

                                           value - 代表遍历出来的每个元素

                                           index - 代表每个元素的下标

                                           array - 代表当前正在遍历的这个数组

                                           return 处理后的新元素

                                           })

    var arr = [1,2,3,4,5,6];
    console.log(arr)
    var brr = arr.map(function(item){
        return item+2
    })
    console.log(brr)

           (4)every:判断数组中是否所有元素都满足指定的条件 - 都满足就返回true,有一个不满

                                                                                                                                     足就返回false

                    语法:var bool = 数组.every(function(value, index, array) {

                                           value - 代表遍历出来的每个元素

                                           index - 代表每个元素的下标

                                           array - 代表当前正在遍历的这个数组

                                           return 条件

                                           })

    var arr = [77,69,30,42,51];
    console.log(arr)
    var bool = arr.every(function(v,index,a){
        return v>100
    })
    console.log(bool)

           (5)some:判断数组中是否至少有一个是满足条件的 - 只要有一个是满足条件的就返回

                                                                                                     true,都不满足条件就返回false

                    语法:var bool = 数组.some(function(value, index, array) {

                                           value - 代表遍历出来的每个元素

                                           index - 代表每个元素的下标

                                           array - 代表当前正在遍历的这个数组

                                           return 条件

                                           })

    var arr = [77,69,30,42,51];
    console.log(arr)
    var bool = arr.some(function(v,index,a){
        return v<40
    })
    console.log(bool)

           (6)find:从数组中找到满足条件的第一个元素 - 找到了就返回元素,找不到就返回

                                                                                                                                 undefined

                    语法:var ele = 数组.find(function(value, index, array) {

                                           value - 代表遍历出来的每个元素

                                           index - 代表每个元素的下标

                                           array - 代表当前正在遍历的这个数组

                                           return 条件

                                           })

    var arr = [77,69,30,42,51];
    console.log(arr)
    var brr = arr.find(function(v,index,a){
        return v>100
    })
    console.log(brr) // undefined

    var arr = [77,69,30,42,51];
    console.log(arr)
    var brr = arr.find(function(v,index,a){
        return v<100
    })
    console.log(brr) // 77

           (7)findIndex:从数组中找到满足条件的第一个元素的下标 - 找到就返回下标,找不到就

                                                                                                                                               返回-1

                    语法:var ele = 数组.findIndex(function(value, index, array) {

                                           value - 代表遍历出来的每个元素

                                           index - 代表每个元素的下标

                                           array - 代表当前正在遍历的这个数组

                                           return 条件

                                           })

    var arr = [77,69,30,42,51];
    console.log(arr)
    var brr = arr.findIndex(function(v,index,a){
        return v>100
    })
    console.log(brr) // -1

    var arr = [77,69,30,42,51];
    console.log(arr)
    var brr = arr.findIndex(function(v,index,a){
        return v<100
    })
    console.log(brr) // 0

           (8)reduce:归并 - 数组求和

                    语法:数组.reduce(function(a, b) {

                                           a第一次代表第一个元素,第二次开始代表上一次返回的结果

                                           b第一次代表第二个元素,第二次代表第三个元素,...

                                           })

    var arr = ['111', '222', '333']
    arr.reduce(function (a, b) {
        console.log(a, b);
    }) // 111 222
       // undefined '333'

    var arr = [1,2,3,4,5,6,7,8]
    console.log(arr)
    var brr = arr.reduce(function(a,b){
        return a + b
    })
    console.log(brr) // 36

七、数组去重

// 方法1.找到重复的,删掉
/* ①找重复 - 一模一样就是重复的 - 全等比较 - 作比较判断 - 谁跟谁比 - 第一个跟他后面
                                        每一个做比较    第二个跟他后面每个作比较 */
var arr = [1, 1, 1, 2, 2, 3, 4, 2, 1, 3, 4]
for(var b = 0; b < arr.length - 1; b++) {
    for(var a = b + 1; a < arr.length; a++) {
        if(arr[b] === arr[a]) {
            arr.splice(a, 1)
            a--
        }
    }
}
console.log(arr);

// 方法2.将所有不重复的元素放在新的数组中
/* ①找到所有不重复的 - arr中每个元素都要判断是否在新数组中 - 判断一个元素是否在数组中 - 
                                                                    用indexOf */
// ②放到新数组中 - 定义新数组 - arr.push(元素)
var arr = [1, 1, 1, 2, 2, 3, 4, 2, 1, 3, 4]
var brr = []
for(var a = 0; a < arr.length; a++) {
    var idx = brr.indexOf(arr[a])
    if(idx === -1) {
        brr.push(arr[a])
    }
}
console.log(brr);

/* 方法3.去重复 - 保证每个元素在数组中都是唯一的 - 对象中的键是唯一的 - 将数组中的每个元
                   素都作为对象的键 - 当所有元素都走完以后,对象中的键就是唯一的元素 */
var arr = [1, 1, 1, 2, 2, 3, 4, 2, 1, 3, 4]
var obj = {}
for(var a = 0; a < arr.length; a++) {
    obj[ arr[a] ] = arr[a]
}
// console.log(obj);
var brr = []
for(var a in obj) {
    brr.push(obj[a])
}
console.log(brr);

// 方法4.最简短的数组去重代码
var arr = [1, 1, 1, 2, 2, 3, 4, 2, 1, 3, 4]
var brr = [...new Set(arr)]
console.log(brr);

八、冒泡排序

          相邻两个元素进行比较,将一个数组中的数字使用循环进行升序或降序的排列

for(var a = 0; a < arr.length - 1;a++) {
	for(var b = 0; b < arr.length - 1; b++){
		if(arr[b] > arr[b+1]){
			var tmp = arr[b]
			arr[b] = arr[b+1]
			arr[b+1] = tmp
		}
	}
}

九、选择排序

          降序:先找最大值,排在最左边,再找第二大的值,往左边靠...,已经排好的,不再参与比较

for(var a = 0; a < arr.length - 1; a++){
	for(var b = a + 1; b < arr.length; b++){
		if(arr[a] > arr[b]){
			var tmp = arr[a]
			arr[a] = arr[b]
			arr[b] = tmp
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值