将数组扁平化,并去除其中重复的部分数据,最终得到一个升序且不重复的数组

let arr = [[21, 2, 17, 18, 2], [3, 4, 95, 5, 5], [6, 6, 7, 8], [9, 10, [11, 12]]];

// =>【1、扁平化】 使用 ES6 中提供的 Array.prototype.flat 处理
// arr = arr.flat(Infinity);

// =>【2、扁平化】 把数组直接变成字符串即可(数组 toString 之后,最后会变为以逗号分隔的字符串)
// arr = arr.toString().split(',').map(item => {
//    return Number(item);
// })

// =>【3、扁平化】
// arr = arr.join('|').split(/(?:,|\|)/g).map(item => {
//   return Number(item);
// })
 
// =>【4、扁平化】 JSON.stringify
// arr = JSON.stringify(arr).replace(/(\[|\])/g, '').split(',').map(item => Number(item));
 
// =>【5、扁平化】 some 方法进行判断检测:验证数组中的某一项有没有符合函数中提供的规则的
// while (arr.some(item => Array.isArray(item))) {
//   arr = [].concat(...arr);
// }
// console.log(arr);

// =>【6、扁平化】 find 方法
//------------ find 和 some 的区别:some 返回的是 boolean, find 找到符合规则的,返回当前这一项,没有找到符合规则的,返回 undefined ------------
 
// =>【7、扁平化】在闭包函数中自己递归处理
~function () {
  function myFlat() {
    let result = [],
     _this = this;
    // => 循环 arr 中的每一项,把不是数组的存储到新数组中
    let fn = (arr) => {
      for (let i = 0; i < arr.length; i++) {
        let item = arr[i];
        if (Array.isArray(item)) {
          fn(item);
          continue;
        }
        result.push(item);
      }
    };
    fn(_this);
    return result;
  }
  Array.prototype.myFlat = myFlat;
}();
arr = arr.myFlat();
console.log(arr)
 
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

// =>【1、去重排序】基于 ES6 中的 new Set() 去重数组并升序
// [...new Set(arr)]
// Array.from(new Set(arr))
   arr = Array.from(new Set(arr)).sort((a, b) => a - b);
   console.log(arr);

// =>【2、去重排序】indexOf
// let res = [];
// for(let i = 0; i < arr.length; i++){
//    if(res.indexOf(arr[i]) === -1){
//       res.push(arr[i]);
//       res.sort((a, b) => a - b);
//    }
// }
// console.log(res);

// =>【3.1、双重 for 循环 将数据和后面的数据进行比对】
// function Arr(arr) {
//    let res = [],
//      isRepeat = false;
//    for (let i = 0; i < arr.length; i++) {
//     isRepeat = false;
//     for (let j = i + 1; j < arr.length; j++) {
//        if (arr[i] === arr[j]) {
//          isRepeat = true;
//          break;
//        }
//      }
//     if (!isRepeat) {
//        res.push(arr[i]);
//        res.sort((a, b) => a - b);
//     }
//   }
//   return res;
// }
// console.log(Arr(arr));


// =>【3.2、双重 for 循环 将数据和新保存的数据进行比对】
// function Arr(arr) {
//    let res = [],
//      isRepeat = false;
//      for (let i = 0; i < arr.length; i++) {
//       isRepeat = false;
//       for (let j = 0; j < res.length; j++) {
//        if (res[j] === arr[i]) {
//          isRepeat = true;
//          break;
//        }
//       }
//       if (!isRepeat) {
//         res.push(arr[i]);
//         res.sort((a, b) => a - b);
//       }
//     }
//     return res;
// }
// console.log(Arr(arr));

// =>【4、去重排序】 forEach 方法
// function Arr(arr) {
//   let res = [];
//     arr.forEach(function (item, idx, arr) {
//     if(!res.includes(item)){
//         res.push(item);
//         res.sort((a, b) => a - b);
//      }
//    })
//    return res;
// }
// console.log(Arr(arr));

// =>【5、去重排序】 reduce 方法
// function Arr(arr) {
//   return arr.sort((a, b) => a - b).reduce(function (res, elem, arr) {
//     if (res.length === 0 || res[res.length - 1] !== elem) {
//       res.push(elem);
//     }
//     return res;
//   }, [])
// }
// console.log(Arr(arr));
posted @ 2020-04-02 13:34  YuTing-721  阅读(367)  评论(0编辑  收藏  举报