JavaScript之数组扁平化与去重

一、数组扁平化

1.利用for循环
循环数组元素,如果还是一个数组,就递归调用该方法

  function flatten(arr) {
    var res = [];
    for (let i = 0, length = arr.length; i < length; i++) {
      if (Array.isArray(arr[i])) {
        res = res.concat(flatten(arr[i])); //concat 并不会改变原数组
      //res.push(...flatten(arr[i])); //扩展运算符  
      } else {
        res.push(arr[i]);
      }
    }
    return res;
  }

2.利用reduce
reduce的用法如下:

array.reduce(function(total, currentValue, currentIndex, arr), initialValue);
/*
  total: 必需。初始值, 或者计算结束后的返回值。
  currentValue: 必需。当前元素。
  currentIndex: 可选。当前元素的索引;                     
  arr: 可选。当前元素所属的数组对象。
  initialValue: 可选。传递给函数的初始值,相当于total的初始值。
*/

代码如下:

 function flatten(arr) {
      return arr.reduce((res,next) =>{
        return res.concat(Array.isArray(next)? flatten(next) : next);
      },[]);
    }

3.利用ES6的...
ES6 增加了扩展运算符...,用于取出参数对象的所有可遍历属性,拷贝到当前对象之中

function flatten(arr) {

    while (arr.some(item => Array.isArray(item))) {
        arr = [].concat(...arr);
    }

    return arr;
}

二、数组去重

1.利用ES6的Set去重

function unique(arr) {
      return Array.from(new Set(arr));
}

2.利用indexOf去重

function unique(array) {
    var res = [];
    for (var i = 0, len = array.length; i < len; i++) {
        var current = array[i];
        if (res.indexOf(current) === -1) {
            res.push(current)
        }
    }
    return res;
}
function unique(arr){
  return arr.reduce(function(prev, next){
    if(prev.indexOf(next) === -1){
      prev.push(next);
    }
    return prev;
  }, []);
}

3.利用sort()排序后去重
我们先对数组进行排序,为了不影响原数组,我们使用了concat()方法,返回新数组。将排序好的数组进行相邻位的比较。如果不相等,推到结果数组里。相等跳过操作。

function unique(array) {
  var sortArr = array.concat().sort() //返回新数组
  var res = [sortArr[0]]
  for(var i=1; i < sortArr.length; i++) {
    if(sortArr[i] !== sortArr[i-1]) {
        res.push(sortArr[i])
    }
  }
  return res
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。