数组处理代码题

77 阅读4分钟

数组去重

1.ES6的Set去重(最推荐)

new Set是ES6新推出的一种类型。他和数组的区别在于,Set类型中的数据不可以有重复的值。当然,数组的一些方法Set也无法调用。

弊端:但是Set去重有一个弊端,他无法去重引用类型的数据。比如对象数组。

    const arr = [1,1,2,2,3,3,4,4,5,5];
    const setData = Array.from(new Set(arr));
    console.log(setData);

双重for

//双重循环去重
function Unique(arr = []) {
    for (let i=0,len = arr.length; i < len; i++) {
        for (let j = i + 1; j < len; j++) {
            if (arr[i] === arr[j]) {
                arr.splice(j, 1);
                j--;
                len--;
            }
        }
    }
    return arr;
};
Unique(arr)

相邻元素去重(for + sort)

这种方法首先调用了数组的排序方法sort(),然后根据排序后的结果进行遍历及相邻元素比对,如果相等则跳过改元素,直到遍历结束

function unique(arr) {
    arr = arr.sort()
    let res = []
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] !== arr[i-1]) {
            res.push(arr[i])
        }
    }
    return res
}

indexOf去重


function Unique(arr = []) {
    let repeatArr = [];
    for (let i = 0,len = arr.length ; i < len; i++) 
     if (repeatArr.indexOf(arr[i]) === -1)  repeatArr.push(arr[i])
    return repeatArr;
}
Unique(arr)



const arr = [1,1,2,2,3,3,4,4,5,5];
function Unique(arr = []) {
    let repeatArr = [];
    for (let i = 0,len = arr.length ; i < len; i++)
        if (!repeatArr.includes(arr[i])) repeatArr.push(arr[i])
    return repeatArr;
}
Unique(arr)




function Unique(arr = []) { arr.filter((item,index) => arr.indexOf(item,0) === index)}
handleRemoveRepeat(arr)



reduce去重

const arr = [1,1,2,2,3,3,4,4,5,5];
function Unique(arr = []) {
    return arr.reduce((t, v) => t.includes(v) ? t : [...t, v], []);
}
Unique(arr)

set与解构赋值去重

ES6中set的一个最大的特点就是数据不重复。Set函数可以接受一个数组(或类数组对象)作为参数来初始化,利用该特性也能做到给数组去重

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    return [...new Set(arr)]
}

数组排序

    var oldArr = [19, 55, 6, 52, 4 , 6, 15, 28, 23, 2, 1, 9]
    oldArr.sort((a, b) => {
      return a-b // 升序
      //reture b-a  降序
    })
    console.log(oldArr);
]

冒泡排序

  var oldArr = [19, 55, 6, 52, 4 , 6, 15, 28, 23, 2, 1, 9]
  function bubbleSort(arr) {
    for(let i = 0; i < arr.length; i++) {
      for (let j = 0; j < arr.length - i; j++) {
        // 如果前一个比后一个大,则交换位置
        if (arr[j] > arr[j+1]) {
          let temp = arr[j]
          arr[j] = arr[j + 1]
          arr[j + 1] = temp
        }
      }
    }
    return arr
  }
  console.log(bubbleSort(oldArr));
  //  [1, 2, 4, 6, 6, 9, 15, 19, 23, 28, 52, 55]

插入排序

  var oldArr = [19, 55, 6, 52, 4 , 6, 15, 28, 23, 2, 1, 9]
  function inserArr(arr) {
    let newArr = []
    for(let i = 0; i < arr.length; i++) {
      if (i === 0) {
        newArr.push(arr[i])
        continue
      }
      for(j = newArr.length -1; j >= 0; j--) {
        if (arr[i] >= newArr[j]) {
          newArr.splice(j + 1, 0, arr[i])
          break
        } else if (j === 0) {
          newArr.splice(0, 0, arr[i])
        }
      }
    }
    return newArr
  }
  console.log(inserArr(oldArr));
  //  [1, 2, 4, 6, 6, 9, 15, 19, 23, 28, 52, 55]

简单数组拍平

const flatten = (list) => list.reduce((a, b) => a.concat(b), []);

const flatten = (list) => [].concat(...list);

深层数组拍平

// depth为自定义拍平的层数,默认为 1
function flatten(list, depth = 1) {
  if (depth === 0) return list;
  return list.reduce(
    (a, b) => a.concat(Array.isArray(b) ? flatten(b, depth - 1) : b),
    []
  );
}

flat 方法可以直接用于数组拍平,不传入参数时默认拍平一层

const arr = ["1", ["2", "3"], ["4", ["5", ["6"]], "7"]];
// 不传参数时,默认“拉平”一层
arr.flat(); // ["1", "2", "3", "4", ["5", ["6"]], "7"]

const arr = [1, [2, 3], [4, [5, [6]], 7]];
// 传入一个整数参数,整数即“拉平”的层数
arr.flat(2);
// [1, 2, 3, 4, 5, [6], 7]
 
// 传入 <=0 的整数将返回原数组,不“拉平”
arr.flat(0);
arr.flat(-10);
// [1, [2, 3], [4, [5, [6]], 7]];
 
// Infinity 关键字作为参数时,无论多少层嵌套,都会转为一维数组
arr.flat(Infinity);
// [", 2, 3, 4, 5, 6, 7]

toString

toString 方法是一个比较简单的方法,他是把数组每个元素转化成字符串之后直接拍平,然后通过 map 遍历每个元素,让其变成 Number 类型

const arr = [1, [2, 3], [4, [5, [6]], 7]];
arr.toString();
arr.toString().split(',');
arr.toString().split(',').map(item) => Number(item);

join

join 的操作和 toString 类似,最后也要通过 map 遍历每个元素,让其变成 Number 类型

const arr = [1, [2, 3], [4, [5, [6]], 7]];
arr.join();
arr.join().split(',');
arr.join().split(',').map(item) => Number(item);

数组转树形结构

forEach


  // 需转化数组示例
  data = [

  { id: '01', lable: '项目经理', pid: '' },
  { id: '02', lable: '产品leader', pid: '01' },
  { id: '03', lable: 'UIleader', pid: '01' },
  { id: '04', lable: '技术leader', pid: '01' },
  { id: '05', lable: '测试leader', pid: '01' },
  { id: '06', lable: '运维leader', pid: '01' },
  { id: '07', lable: '产品经理', pid: '02' },
  { id: '08', lable: '产品经理', pid: '02' },
  { id: '09', lable: 'UI设计师', pid: '03' },
  { id: '10', lable: '前端工程师', pid: '04' },
 ]
 
 
   function toTree(data) {
    const tree = []
    const otherObj = {}
    data.forEach(item => {
      item.children = []
      otherObj[item.id] = item
    })
    data.forEach(item => {
      if (item.pid) {
          otherObj[item.pid].children.push(item)
      } else {
        tree.push(item)
      }
    })
    return tree
  }

toTree(data)

双层filter


let data = [
    { id: 1, text: 't11', parentId: 0 },
    { id: 2, text: 't11', parentId: 0 },
    { id: 3, text: 't11', parentId: 1 },
    { id: 4, text: 't11', parentId: 1 },
    { id: 5, text: 't11', parentId: 3 },
    { id: 6, text: 't11', parentId: 2 }
]

function treeData (data, id, parentId, childName) {
    let cloneData = JSON.parse(JSON.stringify(data))
    return cloneData.filter((father) => {
        let newArr = cloneData.filter((child) => {
            return father[id] === child[parentId]
        })
        father[childName] = newArr
        return father[parentId] === 0
    })
}
let msg = treeData(data, 'id', 'parentId', 'childaaa')
console.log(msg)

面试题:找出多维数组最大值

function fnArr(arr){
	var newArr = [];
	arr.forEach((item,index)=>{
		newArr.push( Math.max(...item)  )
	})
	return newArr;
}
console.log(fnArr([
	[4,5,1,3],
	[13,27,18,26],
	[32,35,37,39],
	[1000,1001,857,1]
]));

给字符串新增方法实现功能

给字符串对象定义一个addPrefix函数,当传入一个字符串str时,它会返回新的带有指定前缀的字符串,例如:

console.log( 'world'.addPrefix('hello') ) 控制台会输出helloworld

//解答:
String.prototype.addPrefix = function(str){
	return str  + this;
}
console.log( 'world'.addPrefix('hello') )

找出字符串出现最多次数的字符以及次数

var str = 'aaabbbbbccddddddddddx';
var obj = {};
for(var i=0;i<str.length;i++){
	var char = str.charAt(i); //charAt从字符串中获取索引值
	if( obj[char] ){
		obj[char]++;
	}else{
		obj[char] = 1;
	}
}
console.log( obj );
//统计出来最大值
var max = 0;
for( var key in obj ){
	if( max < obj[key] ){
		max = obj[key];
	}
}
//拿最大值去对比
for( var key in obj ){
	if( obj[key] == max ){
		console.log('最多的字符是'+key);
		console.log('出现的次数是'+max);
	}
}