嵌套数组扁平化和数组去重

嵌套数组扁平化

1. 利用 Array.prototype.flat

function flattenDeep(arr) {
    //当然,大多时候我们并不会有这么多层级的嵌套
    return arr.flat(Math.pow(2,53) - 1); 
}

2. 利用 reduce 和 concat

function flattenDeep(arr){
    return arr.reduce((acc, val) => Array.isArray(val) 
        ? acc.concat(flattenDeep(val)) 
        : acc.concat(val), []);
}

数组去重

1. 利用 ES6 新数据类型 Set 

Set类似于数组,但是成员的值都是唯一的,没有重复的值。

function unique (arr) {
   return [...new Set(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", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]
不考虑兼容性,这种去重的方法代码最少。这种方法还无法去掉“{}”空对象,后面的高阶方法会添加去掉重复“{}”的方法。

2. 利用 indexOf

       原理:创建新数组,遍历数组中的每个元素,如果用 indexOf 在新数组中找不到就追加到新数组

       优点:最简单(可以去重数字和字符串混合的数组)

       缺点:不能排序

function clear1(arr) {
		var newArr = [];
		for(var i=0; i<arr.length; i++) {
			if(newArr.indexOf(arr[i]) === -1) {
				newArr.push(arr[i]);
			}
		}
		return newArr;
	}

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(clear1(arr))
// [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {…}, {…}]  //NaN、{}没有去重

用 includes 代替 indexOf 也一样。

3. 利用 Map

  function uniq(array) {
    let map = new Map();
    let result = [];
    for (let i = 0; i < array.length; i++) {
        if (!map.has(array[i])) {
            map.set(array[i], true);
            result.push(array[i]);
        }
    }
    return result;
  }

4. 利用 reduce

function uniq(arry) {
    return arry.reduce((prev, cur) => prev.includes(cur) ? prev : [...prev, cur], []);
}

5. 双重 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直接消失了

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

双重 for 循环,后面有相同值则跳过

        原理:遍历当前数组,如果后面有元素跟当前元素相等的,就跳过该元素,没有就在新数组里添加该元素

        优点:可以去重数字和字符串混合的数组

function clear3(){
		var newArrr = [];
		for(var i = 0, l = arr.length; i < l; i++) {
			for(var j = i + 1; j < l; j++){
				if (arr[i] === arr[j]) {
					j = ++i
				}
			}
			newArrr.push(arr[i]);
		}
		return newArrr;
	}

6. 利用 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", {…}, {…}]

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值