JavaScript 数组相关操作方法(数组去重、Array 常用方法 API)【详细总结,值得收藏】


一、数组去重的方法

  1. ES6 Set 去重

    function unique (arr) {
      return Array.from(new Set(arr))
      // Array.from() 方法从一个类似数组或可迭代对象创建一个新的
    }
    var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
    console.log(unique(arr))
     //[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]
    

    不考虑兼容性,这种去重的方法代码最少。这种方法还无法去掉“{}”空对象,后面的高阶方法会添加去掉重复“{}”的方法。

  2. 利用 for 嵌套 for,然后 splice 去重

    function unique(arr){            
        for(var i=0; i<arr.length; i++){
            for(var j=i+1; j<arr.length; j++){
                if(arr[i] == arr[j]){         //第一个等同于第二个,splice方法删除第二个
                    arr.splice(j,1);
                    j--;
                }
            }
        }
    return arr;
    }
    var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
    console.log(unique(arr))
    // [1, "true", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}]     // NaN和{}没有去重,两个null直接消失了
    

    双层循环,外层循环元素,内层循环时比较值。值相同时,则删去这个值。

  3. 利用 indexOf 去重
    indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。

    function unique(arr) {
        if (!Array.isArray(arr)) {
            console.log('type error!')
            return
        }
        var array = [];
        for (var i = 0; i < arr.length; i++) {
            if (array.indexOf(arr[i]) === -1) {
                array.push(arr[i])
            }
        }
        return array;
    }
    var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
    console.log(unique(arr))
    // [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {…}, {…}]  //NaN、{}没有去重
    

    新建一个空的结果数组,for 循环原数组,判断结果数组是否存在当前元素,如果有相同的值则跳过,不相同则push进数组。

  4. sort()

    利用 sort() 排序方法,然后根据排序后的结果进行遍历及相邻元素比对。
    `

    function unique(arr) {
        if (!Array.isArray(arr)) {
            console.log('type error!')
            return;
        }
        arr = arr.sort()
        var arrry = [arr[0]];
        for (var i = 1; i < arr.length; i++) {
            if (arr[i] !== arr[i-1]) {
                arrry.push(arr[i]);
            }
        }
        return arrry;
    }
    var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
    console.log(unique(arr))
    // [0, 1, 15, "NaN", NaN, NaN, {…}, {…}, "a", false, null, true, "true", undefined]      
    // NaN、{} 没有去重
    
  5. includes()
    includes() 检测数组是否有某个值

    function unique(arr) {
        if (!Array.isArray(arr)) {
            console.log('type error!')
            return
        }
        var array = [];
        for(var i = 0; i < arr.length; i++) {
            if( !array.includes( arr[i]) ) { 
            	array.push(arr[i]);
            }
        }
        return array
    }
    var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
    console.log(unique(arr))
    // [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]     
    // {} 没有去重
    
  6. hasOwnProperty()
    利用 hasOwnProperty() 判断是否存在对象属性

    function unique(arr) {
        var obj = {};
        return arr.filter(function(item, index, arr){
            return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
        })
    }
    var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
    console.log(unique(arr))
    // [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}]   
    // 所有的都去重了
    
  7. filter()
    filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。

    function unique(arr) {
        return arr.filter(function(item, index, arr) {
            // 当前元素,在原始数组中的第一个索引 == 当前索引值,否则返回当前元素
            return arr.indexOf(item, 0) === index;
        });
    }
    var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
    console.log(unique(arr))
    // [1, "true", true, 15, false, undefined, null, "NaN", 0, "a", {…}, {…}]
    
  8. 利用递归去重

    function unique(arr) {
        var array= arr;
        var len = array.length;
    
        array.sort(function(a,b){   // 排序后更加方便去重
            return a - b;
        })
    
        function loop(index) {
            if(index >= 1){
                if(array[index] === array[index-1]){
                    array.splice(index,1);
                }
                loop(index - 1);    //递归loop,然后数组去重
            }
        }
        loop(len-1);
        return array;
    }
     var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
    console.log(unique(arr))
    // [1, "a", "true", true, 15, false, 1, {…}, null, NaN, NaN, "NaN", 0, "a", {…}, undefined]
    
  9. 利用 Map 数据结构去重
    创建一个空 Map 数据结构,遍历需要去重的数组,把数组的每一个元素作为 key 存到 Map 中。由于 Map 中不会出现相同的 key 值,所以最终得到的就是去重后的结果。

    function arrayNonRepeatfy(arr) {
        let map = new Map();
        let array = new Array();  // 数组用于返回结果
        for (let i = 0; i < arr.length; i++) {
            if(map.has(arr[i])) {  // 如果有该key值
            	map.set(arr[i], true); 
            } else { 
                map.set(arr[i], false);   // 如果没有该key值
                array.push(arr[i]);
            }
        } 
        return array ;
    }
    var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
    console.log(unique(arr))
    // [1, "a", "true", true, 15, false, 1, {…}, null, NaN, NaN, "NaN", 0, "a", {…}, undefined]
    
  10. 利用 reduce + includes

    function unique(arr){
        return arr.reduce((prev,cur) => prev.includes(cur) ? prev : [...prev,cur],[]);
    }
    var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
    console.log(unique(arr));
    // [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]
    

二、数组常用方法

  1. push(元素1,…,元素n)
    push() 方法可把参数指定的元素依次添加到数组的末尾,并返回添加元素后的数组长度(该方法必须至少有一个参数)。

  2. unshift(元素1,…,元素n)
    unshift() 方法可把参数指定的元素依次添加到数组的前面,并返回添加元素后的数组长度。该方法必须至少有一个参数。注意:IE6、IE7 不支持方法的返回值。

  3. pop()
    pop() 方法可弹出(删除)数组最后一个元素,并返回弹出的元素。

  4. shift()
    shift() 方法可删除数组第一个元素,并返回删除的元素。

  5. splice(index,count[,元素1,…,元素n])
    splic() 方法功能比较强,它可以实现删除指定数量的元素、替换指定元素以及在指定位置添加元素。这些不同功能的实现需要结合方法参数来确定:

    • 当参数只有 indexcount 两个参数时,如果 count 不等于0,splice() 方法实现删除功能,同时返回所删除的元素:从 index 参数指定位置开始删除 count 参数指定个数的元素;
      【2个参数,第二个参数不为 0,实现删除功能】

    • 当参数为 3 个以上,且 count 参数不为0时,splice() 方法实现替换功能,同时返回所替换的元素:用第三个及其之后的参数替换 index 参数指定位置开始的 count 参数指定个数的元素;
      【3个参数,第二个参数不为 0,实现替换功能:】

    • 当参数为 3 个以上,且 count 参数为 0 时,splice() 方法的实现添加功能:用第三个及其之后的参数添加到 index 参数指定位置上。
      【3个参数以上,第二个参数为 0,实现添加功能,没有返回值】

  6. slice(index1[,index2])
    slice() 方法返回包含从数组对象中的第 index1~index2-1 之间的元素的数组。index2 参数可以省略,省略时表示返回从 index1 位置开始一直到最后位置的元素。需要注意的是,该方法只是读取指定的元素,并不会对原数组作任何修改。

  7. sort()sort(compareFunction)
    sort() 方法用于按某种规则排序数组:当方法的参数为空时,按字典序(即元素的 Unicode 编码从小到大排序顺序)排序数组元素;当参数为一个匿名函数时,将按匿名函数指定的规则排序数组元素。sort() 排序后将返回排序后的数组。

  8. concat(数组1,…,数组n)
    concat() 将参数指定的数组和当前数组连成一个新数组。

  9. reverse()
    reverse() 方法可返回当前数组倒序排序形式。

  10. join(分隔符)
    join() 方法可将数组内各个元素按参数指定的分隔符连接成一个字符串。参数可以省略,省略参数时,分隔符默认为“逗号”。

  11. forEach()
    forEach() 方法用于对数组的每个元素执行一次回调函数。

  12. filter()
    filter() 方法用于创建一个新的数组,其中的元素是指定数组中所有符合指定函数要求的元素。

  13. map()
    map() 方法用于创建一个新的数组,其中的每个元素是指定数组的对应元素调用指定函数处理后的值。

  14. reduce()
    reduce() 用于使用回调函数对数组中的每个元素进行处理,并将处理进行汇总返回。

  15. find()
    find() 用于获取使回调函数值为 true 的第一个数组元素。如果没有符合条件的元素,将返回 undefined

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值