网站首页 > 技术文章 正文
- 不通过中间变量交换两个变量的值
let a = 1, b = 5;
// 第一种方法
b = b - a;
a = a + b;
b = a - b;
// 第二种方法,解构赋值
[a, b] = [b, a]
// 第三种方法,位运算(相同元素异或运算得0,0跟其它元素异或运算得到其它元素)
a = a ^ b;
b = a ^ b; // a ^ b ^ b => a
a = a ^ b; // a ^ b ^ a => b
// 位运算的其它用法
// 1、从1-1000中随机删除一个数,求被删除的那个数。
// 2、判断奇偶数(奇数&1 === 1 偶数&1 === 0)
- 将json数据转成树形结构
function treeNode(jsonData) {
let result = [], temp = {}, len = jsonData.length
for (let i = 0; i < len; i++) {
// 以id作为索引存储元素,可以无需遍历直接快速定位元素
temp[jsonData[i]['id']] = jsonData[i]
}
for (let i = 0; i < len; i++) {
const list = jsonData[i]
const jsonList = temp[list['parentId']]
if (!jsonList) { // 不存在父元素,意味着当前元素是一级元素
result.push(list);
} else {
jsonList.children = jsonList.children || []
// result数组中添加的项跟当前的jsonList是对象引用的关系,
// 所以当前jsonList添加了children,result中的项也添加了children
jsonList.children.push(list)
}
}
return result;
}
// 执行
treeNode([
{
id: 1,
parentId: null,
name: "菜单1"
},
{
id: 2,
parentId: null,
name: "菜单2"
},
{
id: 3,
parentId: 1,
name: "菜单1-1"
},
{
id: 4,
parentId: 1,
name: "菜单1-2"
},
{
id: 5,
parentId: 2,
name: "菜单2-1"
},
{
id: 6,
parentId: 5,
name: "菜单2-1-1"
}
])
- 生成斐波那契数组
斐波那契数组:0、1、1、2、3、5、8、13、21、……
function getFibonacci(n) {
const fibarr = [];
let i = 0;
while (i < n) {
if (i <= 1) {
fibarr.push(i);
} else {
fibarr.push(fibarr[i - 1] + fibarr[i - 2])
}
i++;
}
return fibarr;
}
- 数组去重
//es6去重
Array.from(new Set(arr))
// 函数去重
function unique(arr) {
let hashTable = {};
let data = [];
for (let i = 0, l = arr.length; i < l; i++) {
if (!hashTable[arr[i]]) {
hashTable[arr[i]] = true;
data.push(arr[i]);
}
}
return data
}
- 数组扁平化
// 第一种方法
function steamroller(arr) {
let newArr = [];
for (let i = 0; i < arr.length; i++) {
if (!Array.isArray(arr[i])) {
newArr.push(arr[i]);
} else {
newArr = newArr.concat(steamroller(arr[i]));
}
}
return newArr;
}
// 第二种方法
function flatten(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr)
}
return arr;
}
// 第三种方法,es6的flat
[1, [2], [3, [[4]]]].flat(Infinity)
// 第四种方法,toString,不过转出来的都是字符串,适合用于数组元素都是字符串的数组扁平化
[1, [2], [3, [[4]]]].toString().split(',') // ["1", "2", "3", "4"]
['a', ['b'], 'c', [['d']]].toString().split(',') // ["a", "b", "c", "d"]
- 实现一个函数find(obj, str),查找对象属性的值
// 例如find(obj, 'a.b.c')得到obj.a.b.c
function find(obj, str) {
return str.split('.').reduce((target, key) => {
if (!target) return undefined;
return target[key]
}, obj)
}
- 倒序打印链表的值
// 链表
const node = {
val: 1,
next: {
val: 2,
next: {
val: 3,
next: {
val: 4
}
}
}
}
// 打印出 4 3 2 1
function reverseConsole(node) {
if (!node) {
return
} else {
reverseConsole(node.next)
console.log(node.val)
}
}
- 找出字符串中不重复的最长字符串
例如:abacpwwke中中不重复的最长字符串是bacpw
function longSubString(str) {
let maxStr = '', currentStr = '', len = str.length
for (let i = 0; i < len; i++) {
let char = str.charAt(i);
let index = currentStr.indexOf(char)
if (index === -1) {
currentStr += char
if (maxStr.length < currentStr.length) {
maxStr = currentStr
}
} else {
currentStr = currentStr.substring(index + 1) + char
}
}
return maxStr
}
- 冒泡排序
function bubbleSort(arr) {
for (let i = 0, l = arr.length; i < l - 1; i++) {
for (let j = i + 1; j < l; j++) {
if (arr[i] > arr[j]) {
[arr[i], arr[j]] = [arr[j], arr[i]]
}
}
}
return arr;
}
- 插入排序
function insertSort(arr) {
const len = arr.length
for (let i = 1; i < len; i++) {
let preIndex = i - 1;
let current = arr[i];
while (preIndex >= 0 && arr[preIndex] > current) {
arr[preIndex + 1] = arr[preIndex]
preIndex--
}
arr[preIndex + 1] = current
}
return arr
}
- 快速排序
function quickSort(arr) {
if (arr.length <= 1) {
return arr;
}
let leftArr = [];
let rightArr = [];
let q = arr[0];
for (let i = 1, l = arr.length; i < l; i++) {
if (arr[i] > q) {
rightArr.push(arr[i]);
} else {
leftArr.push(arr[i]);
}
}
return [].concat(quickSort(leftArr), [q], quickSort(rightArr));
}
- 二分法查找
对已经排好序的数组,查找某个元素在数组中的顺序。
例如数组[1,2,3,4,5,6,7],查找5的位置
function binarySearch(arr, key) {
let low = 0, high = arr.length - 1;
while (low <= high) {
let mid = parseInt((high + low) / 2);
if (key == arr[mid]) {
return mid;
} else if (key > arr[mid]) {
low = mid + 1;
} else if (key < arr[mid]) {
high = mid - 1;
}
}
return -1;
};
- 上一篇: 【前端学算法】排序算法知多少(一)
- 下一篇: 聊一聊前端算法面试——递归 前端递归算法经典实例
猜你喜欢
- 2025-06-09 平面几何算法:求点到直线和圆的最近点
- 2025-06-09 解决雪花算法生成的ID传到前端后精度丢失问题
- 2025-06-09 什么是非对称加密算法?(什么是非对称加密,有哪些特点)
- 2025-06-09 React18的diff算法(react-diff-view)
- 2025-06-09 「算法题」判断一颗二叉树是否对称
- 2025-06-09 经典监督式学习算法 - 决策树(决策监督制度)
- 2025-06-09 「西瓜哥说算法」从前序与中序遍历序列构造二叉树
- 2024-09-29 前端算法面试题 前端面试题csdn
- 2024-09-29 每天一道算法题——最长连续递增序列
- 2024-09-29 高级前端开发带你搞懂vue的diff算法
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)