JavaScript Array对象

1.数组元素添加与删除

方法名 说明 返回值
push(val) 把目标元素添加到数组的末尾 返回操作完成后数组的长度
unshift(val) 把目标元素添加到数组的最前面 返回操作完成后数组的长度
pop() 删除数组最后一个元素 返回被删除的元素
shift() 删除数组的第一个元素 返回被删除的元素
<script>
    var arr = [1,2,3,4]

    // 在数组末尾添加元素
    arr.push(5)
    console.log(arr) // [1, 2, 3, 4, 5]

    // 删除数组最后一个元素
    arr.pop()
    console.log(arr) // [1, 2, 3, 4]

    // 在数组最前面添加元素
    arr.unshift(0)
    console.log(arr) // [0, 1, 2, 3, 4]

    // 删除数组的第一个元素
    arr.shift()
    console.log(arr) // [1, 2, 3, 4] 

    //返回数组长度
   console.log(arr.length) //4
    //清空数组
    arr.length = 0
    console.log(arr) //[]
</script>

2.数组的遍历

  • for循环
<script>
    var arr = [1,2,3,4]

    // for循环
    for(var i=0;i<arr.length;i++){
        console.log(arr[i])
    }
</script>
  • for in:用于遍历对象中的key,数组是对象的一种特殊形式(数组的下标就相当于对象的key),所以也可以遍历,!!!但是如果数组本来挂载了属性,这个属性会被遍历到
<script>
    var arr = [1,2,3,4]

    for(index in arr){
        //对于数组就是index,对于对象就是key
        console.log(index)
    }

    var arr = [5,10,15,20]
    arr.title = 'arr - title'
    for(key in arr){
        console.log(key) //0 1 2 3 title 包含数组的属性
    }
</script>
  • for of:遍历数组元素的值
<script>
    var arr = [5,10,15,20]

    for(const item of arr){
        console.log(item) //5 10 15 20 不包含数组的属性
    }
</script>
  • forEach:
<script>
    var arr = [1,2,3,4]

    // forEach
    arr.forEach(function(val,index){
        console.log(val,index)
    })  
</script
  • 终止遍历:break用于跳出循环体,continue用于终止本轮循环,直接进入下一轮(forEach不适用这两个语句,会报错)
<script>
var arr = ['A','B','C','D','E']
    for(var i=0;i<arr.length;i++){
        console.log('index = ' + i)
        if(arr[i] == 'D'){
                break; //找到D之后,不会循环后面的 'E'
        }
        console.log('value = ' + arr[i])
    }

var arr = ['A','B','C','D','E']
    for(var i=0;i<arr.length;i++){
        console.log('index = ' + i)
        if(arr[i] == 'D'){
                continue; //找到D之后,不会循环后面的 'D' 但是会继续循环后面的 'E'
        }
        console.log('value = ' + arr[i])
    }
</script>

3.ES6数组新增方法

  • map(cb):映射
<script>
    var arr = [1,2,3,4]

    var newArr = arr.map(function(val){
        return val*2 //新数组元素
    })

    console.log(newArr) // [2, 4, 6, 8]
</script>
  • filter(cb):过滤
<script>
    var arr = [1,2,3,4]

    var newArr = arr.filter(function(val){
        // 只保留 >2 的元素
        return val>2
    })

    console.log(newArr) // [3, 4]
</script>
  • some(cb) :检测数组中是否有元素满足条件,只要有一个满足就返回true,否则返回false
<script>
    var arr = [1,2,3,4]

    var flag = arr.some(function(val){
        return val>2
    })
    console.log(flag) // true

    var flag2 = arr.some(function(val){
        return val>5
    })
    console.log(flag2) // false
</script>
  • every(cb):所有元素都满足才会返回true,否则返回false
<script>
    var arr = [1,2,3,4]

    var flag = arr.every(function(val){
        return val>2
    })
    console.log(flag) // false

    var flag2 = arr.every(function(val){
        return val>0
    })
    console.log(flag2) // true
</script>
  • reduce(cb):累加器,对数组元素进行遍历,每次遍历就进行依次累加计算,遍历结束后返回累加的最终值,语法:arr.reduce((要累加并返回的数,数组元素) => {},初始值)
var list = [
    {name:'西瓜',price:2,num:2},
    {name:'香蕉',price:4,num:1},
    {name:'玉米',price:2,num:5},
    {name:'苹果',price:8,num:1}
]
var totalPrice = list.reduce((total,item) => {
    return total + item.price * item.num
},0)
console.log(totalPrice)  // 26

4.数组元素查询

  • 查找数组元素的下标
方法名 返回值
indexOf(item) 返回具体元素在数组中的下标,当元素是简单数据类型时适用
lastIndexOf(item) 返回具体元素在数组中的下标,从后往前查找
findIndex(cb) 查找符合条件的第一个元素的下标
<script>
    var arr = [1,2,3,4]

    var index = arr.indexOf(1)
    console.log(index) // 0
    var index2 = arr.indexOf(5) // 没有这个元素
    console.log(index2) // -1

    var index3 = arr.findIndex(function(val){
        return val>2
    })
    console.log(index3) // 2
    var index4 = arr.findIndex(function(val){
        // 没有一个元素符合条件
        return val>5
    })
    console.log(index4) //-1
</script>
  • 查找数组元素 find(cb):返回符合条件的第一个元素,没有符合结果则返回undefined
<script>
    var arr = [1,2,3,4]

    var result = arr.find(function(val){
        // 查找第一个大于3.5的子元素
        return val>3.5
    })
    console.log(result) // 4
</scr
  • 判断一个数组是否含有某个子元素 includes():进行对比时,数据类型必须一致
<script>
    var arr = [1,2,3,4]

    // 数组是否含有 1
    var flag = arr.includes(2)
    // 数组是否含有 5
    var flag2 = arr.includes(5)
    // 数组是否含有 '2'
    var flag3 = arr.includes('2')

    console.log(flag) // true
    console.log(flag2) // false
    console.log(flag3) // false
</script>

5.数组转换

  • 数组与字符串间的转换 split()/join()
<script>
    var str = "hello world"
    // 根据标识将字符串分割成数组
    var arr = str.split(" ")
    console.log(arr) //["hello", "world"]

    // 将数组的子元素拼接成字符串
    var str2 = arr.join("-")
    console.log(str2) // "hello-world"
</script>
  • set转换:可利用set的机制对数组去重
//数组转set
var myset = new Set([1,2,3,3])
//set转数组
var arr = Array.form(myset)//[1,2,3]

6.数组排序

  • 1.sort排序 : 不传参的时候按字母升序,适用于一维数组,如果传参,则按数字排序
    注意:!!!这个方法会改变原数组
    注意:!!!二维数组只能进行数字排序,无法进行字符排序
<script>
    var arr = [
        {name:"张三",age:18},
        {name:"李四",age:16},
        {name:"王五",age:10},
        {name:"赵六",age:22}
    ]
    arr.sort(function(p1,p2){
        //p1.age-p2.age就是升序
        //p2.age-p1.age就是降序
        //p2.name-p1.name是无效的
        return p1.age-p2.age
    })
    console.log(arr)
    // [{name: "王五", age: 10}
    // {name: "李四", age: 16}
    // {name: "张三", age: 18}
    // {name: "赵六", age: 22}]
</script>
  • 2.数组反转 reverse() 将当前数组反转,会改变当前数组
<script>
    var arr = [1,2,3,4]
    arr.reverse()
    console.log(arr) // [4, 3, 2, 1]
</script>
  • 3.插入排序
    从第二个元素开始,拿他前面的元素与它比较,如果它比前面的元素小,则这个对比元素往后挪一个位置(实际上是arr[p + 1] = arr[p]),接着往左边找对比元素左比较,直到找到最后一个或者比它小的元素位置为止,此时将这个元素放到这个相应的位置(arr[p + 1] = temp),每轮循环结束都能保证前面的数据是升序排列的
<script>
    var arr = [6, 3, 4, 7, 5, 19, 2];
    var length = arr.length;
    // 进行升序排列,大的元素往右边挤,小的元素往左边挤
    for (var i = 1; i < length; i++) {
        // i为当前元素的下标
        var temp = arr[i];
        // p为比对元素的下标
        p = i - 1;
        // 如果当前元素比目标元素小
        while (p >= 0 && temp < arr[p]) {
            // 将比对元素往右挪一个位置
            arr[p + 1] = arr[p];
            // 往左一个位置找新的比对元素
            p--;
        }
        // 将当前元素放到合适的位置
        arr[p + 1] = temp;
    }
    console.log(arr) // [2, 3, 4, 5, 6, 7, 19]
</script>
  • 4.快速排序
    将一个数组的中间元素取出(splice,这个方法会改变原数组,同时将将截取的元素以数字的形式返回),然后定义两个左右空数据,遍历这个原数组,将小于被取出元素值的元素放入左边的数组,反之放入右边的数组,一轮循环之后将这左右两个数组和中间元素拼接起来,同时对左右数组进行递归调用
var arr = [4, 3, 6, 7, 5, 19, 2];
var newArr = quickSort(arr);
console.log(newArr);
function quickSort(arr) {
    if (arr.length <= 1) return arr;
    else {
        var center = parseInt((arr.length - 1) / 2);
        var centerValue = arr.splice(center, 1)[0];
        var left = [];
        var right = [];
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] <= centerValue) {
                left.push(arr[i]);
            } else {
                right.push(arr[i]);
            }
        }
        return quickSort(left).concat(centerValue, quickSort(right));
    }
}
  • 5 冒泡排序:使用双层循环,将最前面的数据依次与后面的数据对比,发现后面最大值或者最小值则进行位置交互,每轮循环都能找到所剩的最大值或者最小值
<script>
    //冒泡排序
    var arr = [2,6,5,9,1]
    //进行arr.length-1次循环,保证最小的数能冒泡到最前面
    for(var i=0;i<arr.length-1;i++){
        //i为当前元素的下标
        for(var j=0;j<arr.length-1;j++){
            //升序
            if(arr[j] > arr[j+1]){
                //交换数值
                var temp = arr[j]
                arr[j] = arr[j+1]
                arr[j+1] = temp
            }
        }
    }
    console.log(arr)
</script>

7.数组剪切与拼接

  • 剪接数组 splice() 用来删除数组元素或者向数组里面添加元素,会改变当前数组,且以数组形式返回被剪切的元素
    语法:arr.splice(index,num,item1,item2...)
    index:规定从何处添加/删除元素
    num:删除多少元素
    后面的参数可以是0个也可以是多个,表示要添加的数组元素

返回值:以数组形式返回被剪切的元素,没有删除则返回空数组

<script>
    var arr = [1,2,3,4,5,6]
    // 删除数组元素
    var result = arr.splice(0,2)
    console.log(arr) // [3, 4, 5, 6] 原数组被改变
    console.log(result) // [1, 2] 返回值 

    var arr2 = [1,2,3,4,5,6]
    //添加数组元素
    var result2 = arr2.splice(2,0,"good day")
    console.log(arr2) // [1, 2, "good day", 3, 4, 5, 6] 原数组被改变
    console.log(result2) // [] 没有删除则返回空数组 
</script>
  • 数组剪切 slice() 根据给定的下标,将两个下标之间的元素以数组形式返回,不会改变原数组
<script>
    var arr = [1,2,3,4]
    // 不包含 参数二 对应的下标元素
    var newArr = arr.slice(1,3)
    console.log(arr) //[1, 2, 3, 4] 不改变原数组
    console.log(newArr) // [2, 3]

    // 默认剪切到最后一个元素
    var newArr2 = arr.slice(1)
    console.log(newArr2) //[2, 3, 4]

    // 可接受负数
    var newArr3 = arr.slice(0,-1)
    console.log(newArr3) //[1, 2, 3]
</script>
  • 拼接2个数组 concat(),不会改变原数组,而是将拼接后的新数组返回
<script>
    var arr = [1,2,3,4]
    var arr2 = [5,6,7,8]
    var newArr = arr.concat(arr2)
    console.log(arr) // [1,2,3,4]
    console.log(arr2) // [5,6,7,8]
    console.log(newArr) //  [1, 2, 3, 4, 5, 6, 7, 8]
</script>

8.数组的特性

  • 如果数组只有一个元素,则可以直接对其进行判断,不需要下标
var arr = ["66"]
console.log(arr == '66') //true
console.log(arr === '66') //false

var arr2 = ["66","66"]
console.log(arr2 == '66') //false
  • 伪数组:伪数组是一个对象,但它可以通过下标的方式访问它内部的属性值,它不是数组,所以无法使用push(),pop()等方法,可以将其转换成真实的数值以方便对其遍历
<script>
    var likeArr = {}
    likeArr[0] = "center"
    likeArr[1] = "redFont"
    likeArr.value = "center redFont"
    //没有length属性无法正常转换成数组
    console.log(likeArr) //{0: "center", 1: "redFont", value: "center redFont
    console.log(Array.from(likeArr)) //[]
    //添加length属性后才能正常转换成数组
    likeArr.length = 2 
    console.log(likeArr) //{0: "center", 1: "redFont", value: "center redFont", length: 2}
    console.log(Array.from(likeArr)) //["center", "redFont"]
    // 添加splice方法可以让伪数组以数组形式打印
    likeArr.splice = [].splice
    console.log(likeArr)// ["center", "redFont", value: "center redFont", splice: ƒ]
</script>

9.数组分割

  • 将一维数组按照固定长度分割成二维数组,可用于表格本地分页
//数组分割
function cutArray(arr, size){
    var length = arr.length
    var start = 0
    var end = start + size
    var result = []
    //如果起始下标仍在length之内 则循环剪切
    while(start < length){
        //剪切
        result.push(arr.slice(start,end))
        //更新下标
        start = end
        end = start + size
    }
    return result
}

示例:

var arr = [ 1,2,3,4,5,6,7,8]
console.log(cutArray(arr,3)) //[[1,2,3],[4,5,6],[7,8]]

10.数组元素是否有重复

  • 思路:复制一份对照数组,然后循环遍历 与对照数组 做对比,有重复则已数组形式输出对应元素的下标
<script>
    //复制一份对照数组,然后循环遍历 与对照数组 做对比
    function hasRepeat(arr=[],key = ''){
        //对照数组
        var contrast_arr = [...arr]
        var index_list = [] //重复元素下标数组
        for(var i=0;i<arr.length;i++){
            //判断元素是否存在数组中
            for(var j=i+1;j<contrast_arr.length;j++){
                var item = contrast_arr[j]
                //如果不存在key 则直接对比数组元素
                if(!key){
                    if(arr[i] == item){
                        index_list.push(i)
                        index_list.push(j)
                    }
                }else{
                    //存在key 则读取key字段再对比
                    if(arr[i][key] == item[key]){
                        index_list.push(i)
                        index_list.push(j)
                    }
                }
            }
            
            //如果已经找到重复 则中断循环
            if(index_list.length>0){
                return index_list
            }
        }
        return index_list
    }

    var num_arr = [20,30,40,50,60]
    var num_arr2 = [20,30,40,50,20]
    console.log(hasRepeat(num_arr)) //[]
    console.log(hasRepeat(num_arr2)) //[0,4]

</script>
posted @ 2019-09-23 16:48  ---空白---  阅读(355)  评论(0编辑  收藏  举报