前端算法整理

1. 数组扁平化 flat

let arr = [[0, 1], [2, 3], [4,[5,6,7]]]

const newArr = function(arr) {
    return arr.reduce((total, num) => {
        return total.concat(Array.isArray(num)?newArr(num):num)
    },[])
}

console.log(newArr(arr));

2. 数组去重

1. 读、写指针
let arr = [1,1,2,2,3,4,5];
var removeDuplicates = function () {
    let p1 = 0,
        p2 = 0;

    while (p2 < arr.length) {
        if (arr[p1] != arr[p2]) {
            p1++;
            arr[p1] = arr[p2];
        }
        p2++;
    }
    return arr.splice(0,p1+1);
};

console.log(removeDuplicates()); // [ 1, 2, 3, 4, 5 ]

在这里插入图片描述

2. reduce 方法
let arr = [1,1,2,2,3,4,5];
let obj = {}
const newArr = function(arr) {
    return arr.reduce((total, num) => {
    if(!obj[num]) {
        total.push(num)
    }
    obj[num] = true
    return total
    }, [])
}

console.log(newArr(arr))// [ 1, 2, 3, 4, 5 ]
3. es6 set 方法
let arr = [1,1,2,2,3,4,5];

arr = [...new Set(arr)];
console.log(arr);

3. 数组翻转

var arr = [1,2,3,4,5];
for(var i=0;i<arr.length/2;i++){
    var temp = arr[i];
    arr[i]=arr[arr.length-1-i];
    arr[arr.length-1-i]=temp;
}
console.log(arr); //输出[5,4,3,2,1]

4. 两个对象数组根据 id 取补集

let obj1 = [{id: 1}, {id: 2}]
let obj2 = [{id: 1}]

let obj = obj1.filter(item => !obj2.some(obj => item.id === obj.id))
console.log(obj) // [ { id: 2 } ]

5. 树形结构变一维数组

let tree = [{
	id: 1,
	pid: 0,
	name: '沃尔玛',
	children: [
	{
		id: 2,
		pid: 1,
		name: '生鲜区',
		children: [{
			id: 4,
			pid: 2,
			name: '鱼'
		},
		{
			id: 5,
			pid: 2,
			name: '牛肉'
		}]
	},
	{
		id: 3,
		pid: 1,
		name: '日用品区',
		children: [{
			id: 6,
			pid: 3,
			name: '卫生纸'
		},
		{
			id: 7,
			pid: 3,
			name: '牙刷'
		}]
	}]
}]

const treeToArray = (tree) => { // tree是要传递的树形结构数组
  return tree.reduce((total, item) => {
    return total.concat(item, item.children ? treeToArray(item.children) : [])
  }, [])
}
console.log(treeToArray(tree))
[
  { id: 1, pid: 0, name: '沃尔玛', children: [ [Object], [Object] ] },
  { id: 2, pid: 1, name: '生鲜区', children: [ [Object], [Object] ] },
  { id: 4, pid: 2, name: '鱼' },
  { id: 5, pid: 2, name: '牛肉' },
  { id: 3, pid: 1, name: '日用品区', children: [ [Object], [Object] ] },
  { id: 6, pid: 3, name: '卫生纸' },
  { id: 7, pid: 3, name: '牙刷' }
]

5. 一维数组变树形结构

const arrayToTree = (arr, pid) => {
  return arr.reduce((res, current) => {
    if (current['pid'] === pid) {
      current.children = arrayToTree(arr, current['id'])
      return res.concat(current)
    }
    return res
  }, [])
}

6. 力扣 46 全排列

let permute = (nums) => {
    let res = []
    dfs([])
    function dfs(path) {
        if (path.length === nums.length) {
            res.push([...path])
            return
        }
        for (let i = 0; i<nums.length; i++) {
            if (path.includes(nums[i])) {
                continue
            }
            path.push(nums[i])
            dfs(path)
            path.pop()
        }
    }
    return res
}
permute([1,2,3])

7. 找出数组中,同一元素数量大于数组一般的元素,没有则返回0

let arr = [1, 2, 3, 2, 2, 2, 4, 5, 2]

function findNum(arr) {
  for (var i = 0; i < new Set(arr).size; i++) {
    if (
      arr.filter((val) => {
        return val === arr[i]
      }).length >
      arr.length / 2
    ) {
      return arr[i]
    }
  }
}
console.log(findNum(arr))

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值