前端基础函数算法整理应用(sort+reduce+date+双重for循环)

文章目录

    • 基础函数算法
    • reduce 函数算法
    • sort 函数算法
    • 时间排序
      • 1. 对日期字符串数组进行排序
      • 2. 对包含日期对象的数组进行排序
      • 3. 对包含时间戳的数组进行排序
      • 4. 对包含日期时间信息的对象数组进行排序

基础函数算法

一、排序算法

  1. 冒泡排序(Bubble Sort)
    • 原理
      • 比较相邻的元素。如果第一个比第二个大(升序),就交换它们两个。
      • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
      • 针对所有的元素重复以上的步骤,除了最后一个。
      • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    • 代码示例
function bubbleSort(arr) {
    var len = arr.length;
    for (var i = 0; i < len - 1; i++) {
        for (var j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换位置
                var temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    return arr;
}
var arr = [5, 4, 3, 2, 1];
console.log(bubbleSort(arr));
  1. 选择排序(Selection Sort)
    • 原理
      • 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
      • 然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
      • 以此类推,直到所有元素均排序完毕。
    • 代码示例
function selectionSort(arr) {
    var len = arr.length;
    for (var i = 0; i < len - 1; i++) {
        var minIndex = i;
        for (var j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        if (minIndex!== i) {
            var temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }
    return arr;
}
var arr = [5, 4, 3, 2, 1];
console.log(selectionSort(arr));
  1. 插入排序(Insertion Sort)
    • 原理
      • 从第二个元素开始(索引为1),将当前元素与前面已排序的元素进行比较。
      • 如果当前元素小于前面的元素,则将前面的元素后移一位,然后继续向前比较,直到找到合适的位置插入当前元素。
      • 重复这个过程,直到所有元素都插入到正确的位置。
    • 代码示例
function insertionSort(arr) {
    for (var i = 1; i < arr.length; i++) {
        var current = arr[i];
        var j = i - 1;
        while (j >= 0 && arr[j] > current) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = current;
    }
    return arr;
}
var arr = [5, 4, 3, 2, 1];
console.log(insertionSort(arr));

二、搜索算法

  1. 线性搜索(Linear Search)
    • 原理
      • 从数组的第一个元素开始,逐个检查每个元素,直到找到目标元素或者遍历完整个数组。
    • 代码示例
function linearSearch(arr, target) {
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] === target) {
            return i;
        }
    }
    return -1;
}
var arr = [1, 3, 5, 7, 9];
console.log(linearSearch(arr, 5));
  1. 二分搜索(Binary Search,要求数组是有序的)
    • 原理
      • 首先,比较目标元素和数组中间元素的大小。
      • 如果目标元素等于中间元素,则搜索结束。
      • 如果目标元素小于中间元素,则在数组的左半部分继续搜索。
      • 如果目标元素大于中间元素,则在数组的右半部分继续搜索。
      • 重复这个过程,直到找到目标元素或者确定目标元素不存在。
    • 代码示例
function binarySearch(arr, target) {
    var low = 0;
    var high = arr.length - 1;
    while (low <= high) {
        var mid = Math.floor((low + high)/2);
        if (arr[mid] === target) {
            return mid;
        } else if (arr[mid] < target) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
    return -1;
}
var arr = [1, 3, 5, 7, 9];
console.log(binarySearch(arr, 5));

三、字符串操作算法

  1. 字符串反转(String Reversal)
    • 原理
      • 可以将字符串转换为数组,然后使用数组的反转方法,最后再将数组转换回字符串。或者通过逐个字符交换的方式来反转字符串。
    • 代码示例(使用数组方法)
function reverseString(str) {
    return str.split("").reverse().join("");
}
console.log(reverseString("hello"));
  • 代码示例(逐个交换)
function reverseString2(str) {
    var newStr = "";
    for (var i = str.length - 1; i >= 0; i--) {
        newStr += str[i];
    }
    return newStr;
}
console.log(reverseString2("hello"));
  1. 字符串匹配(简单的模式匹配,例如判断一个字符串是否包含另一个字符串)
    • 原理
      • 可以使用JavaScript原生的indexOf方法来检查一个字符串是否包含另一个字符串。如果indexOf返回的值大于等于0,则表示包含。
    • 代码示例
function containsString(str, subStr) {
    return str.indexOf(subStr) >= 0;
}
console.log(containsString("hello world", "world"));

reduce 函数算法

  1. 默认排序(字符串Unicode码点排序)
    • 原理
      • sort方法没有传入比较函数时,它会将数组元素转换为字符串,并按照Unicode码点顺序对这些字符串进行排序。对于数字数组,这种排序方式可能不符合预期。例如,[10, 2, 30]排序后可能得到[10, 2, 30],因为在Unicode码点顺序下,"10"会排在"2"之前。
    • 代码示例
const arr = ["apple", "banana", "cherry"];
arr.sort();
console.log(arr); 
  • 这里arr数组中的字符串元素会按照字典序(即字符的Unicode码点顺序)进行排序,结果为["apple", "banana", "cherry"]
  1. 数字排序
    • 原理
      • 为了正确地对数字数组进行排序,需要传入一个比较函数。比较函数接受两个参数ab,如果a小于b,则返回一个小于0的值;如果a等于b,则返回0;如果a大于b,则返回一个大于0的值。对于升序排序,通常返回a - b
    • 代码示例
const numbers = [10, 2, 30];
numbers.sort((a, b) => a - b);
console.log(numbers); 
  • 在这个例子中,比较函数(a, b) => a - b会计算ab的差值。当a小于b时,a - b小于0,数组会将a排在b之前,最终得到升序排列的数组[2, 10, 30]
  1. 降序排序
    • 原理
      • 与升序排序类似,只是比较函数返回b - a,这样当b大于a时,返回值大于0b就会排在a之前。
    • 代码示例
const numbers = [10, 2, 30];
numbers.sort((a, b) => b - a);
console.log(numbers); 
  • 这里的比较函数(a, b) => b - a使得数组按照降序排列,结果为[30, 10, 2]
  1. 对象数组排序
    • 原理
      • 对于对象数组,可以根据对象的某个属性值进行排序。比较函数会根据对象属性的值来比较两个对象。
    • 代码示例
const people = [
    { name: "Alice", age: 25 },
    { name: "Bob", age: 30 },
    { name: "Charlie", age: 20 }
];
// 根据年龄升序排序
people.sort((a, b) => a.age - b.age);
console.log(people);
  • 在这个对象数组中,比较函数(a, b) => a.age - b.age根据对象的age属性进行比较。当a.age小于b.age时,a会排在b之前,最终得到按照年龄升序排列的对象数组[{"name": "Charlie", "age": 20}, {"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}]
  1. 复杂条件排序(多个属性排序)
    • 原理
      • 有时候需要根据多个属性对对象数组进行排序。可以在比较函数中先根据一个属性进行比较,如果该属性值相等,再根据另一个属性进行比较。
    • 代码示例
const students = [
    { name: "Alice", grade: "A", age: 20 },
    { name: "Bob", grade: "B", age: 22 },
    { name: "Charlie", grade: "A", age: 21 }
];
// 先根据成绩升序排序,如果成绩相同,再根据年龄升序排序
students.sort((a, b) => {
    if (a.grade === b.grade) {
        return a.age - b.age;
    }
    if (a.grade < b.grade) {
        return -1;
    }
    return 1;
});
console.log(students);
  • 这个比较函数首先比较对象的grade属性。如果grade属性相同,就比较age属性。最终得到按照成绩升序排列,成绩相同则按照年龄升序排列的对象数组[{"name": "Bob", "grade": "B", "age": 22}, {"name": "Alice", "grade": "A", "age": 20}, {"name": "Charlie", "grade": "A", "age": 21}]

sort 函数算法

  1. 默认排序(字符串Unicode码点排序)
    • 原理
      • sort方法没有传入比较函数时,它会将数组元素转换为字符串,并按照Unicode码点顺序对这些字符串进行排序。对于数字数组,这种排序方式可能不符合预期。例如,[10, 2, 30]排序后可能得到[10, 2, 30],因为在Unicode码点顺序下,"10"会排在"2"之前。
    • 代码示例
const arr = ["apple", "banana", "cherry"];
arr.sort();
console.log(arr); 
  • 这里arr数组中的字符串元素会按照字典序(即字符的Unicode码点顺序)进行排序,结果为["apple", "banana", "cherry"]
  1. 数字排序
    • 原理
      • 为了正确地对数字数组进行排序,需要传入一个比较函数。比较函数接受两个参数ab,如果a小于b,则返回一个小于0的值;如果a等于b,则返回0;如果a大于b,则返回一个大于0的值。对于升序排序,通常返回a - b
    • 代码示例
const numbers = [10, 2, 30];
numbers.sort((a, b) => a - b);
console.log(numbers); 
  • 在这个例子中,比较函数(a, b) => a - b会计算ab的差值。当a小于b时,a - b小于0,数组会将a排在b之前,最终得到升序排列的数组[2, 10, 30]
  1. 降序排序
    • 原理
      • 与升序排序类似,只是比较函数返回b - a,这样当b大于a时,返回值大于0b就会排在a之前。
    • 代码示例
const numbers = [10, 2, 30];
numbers.sort((a, b) => b - a);
console.log(numbers); 
  • 这里的比较函数(a, b) => b - a使得数组按照降序排列,结果为[30, 10, 2]
  1. 对象数组排序
    • 原理
      • 对于对象数组,可以根据对象的某个属性值进行排序。比较函数会根据对象属性的值来比较两个对象。
    • 代码示例
const people = [
    { name: "Alice", age: 25 },
    { name: "Bob", age: 30 },
    { name: "Charlie", age: 20 }
];
// 根据年龄升序排序
people.sort((a, b) => a.age - b.age);
console.log(people);
  • 在这个对象数组中,比较函数(a, b) => a.age - b.age根据对象的age属性进行比较。当a.age小于b.age时,a会排在b之前,最终得到按照年龄升序排列的对象数组[{"name": "Charlie", "age": 20}, {"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}]
  1. 复杂条件排序(多个属性排序)
    • 原理
      • 有时候需要根据多个属性对对象数组进行排序。可以在比较函数中先根据一个属性进行比较,如果该属性值相等,再根据另一个属性进行比较。
    • 代码示例
const students = [
    { name: "Alice", grade: "A", age: 20 },
    { name: "Bob", grade: "B", age: 22 },
    { name: "Charlie", grade: "A", age: 21 }
];
// 先根据成绩升序排序,如果成绩相同,再根据年龄升序排序
students.sort((a, b) => {
    if (a.grade === b.grade) {
        return a.age - b.age;
    }
    if (a.grade < b.grade) {
        return -1;
    }
    return 1;
});
console.log(students);
  • 这个比较函数首先比较对象的grade属性。如果grade属性相同,就比较age属性。最终得到按照成绩升序排列,成绩相同则按照年龄升序排列的对象数组[{"name": "Bob", "grade": "B", "age": 22}, {"name": "Alice", "grade": "A", "age": 20}, {"name": "Charlie", "grade": "A", "age": 21}]

时间排序

在JavaScript中,如果你有一个包含时间信息(如日期)的数组,想要对其进行排序,可以使用Array.prototype.sort方法,并结合Date对象来实现。以下是几种常见的基于时间的排序场景及实现方法:

1. 对日期字符串数组进行排序

假设数组中的元素是日期字符串,格式为YYYY - MM - DD

// 日期字符串数组
const dateStrings = ["2023-10-05", "2023-09-15", "2023-11-20"];

// 排序函数
dateStrings.sort((a, b) => {
    return new Date(a) - new Date(b);
});

console.log(dateStrings);

在上述代码中:

  • sort方法接受一个比较函数,该函数接收两个参数ab
  • new Date(a)new Date(b)将日期字符串转换为Date对象。
  • 通过new Date(a) - new Date(b)计算两个日期对象的时间差,如果a的日期早于b,则返回一个负数,sort方法会将a排在b之前;如果时间差为0,则保持原顺序;如果a的日期晚于b,则返回一个正数,sort方法会将a排在b之后。

2. 对包含日期对象的数组进行排序

假设数组中直接存储的是Date对象。

// 日期对象数组
const dates = [
    new Date("2023-10-05"),
    new Date("2023-09-15"),
    new Date("2023-11-20")
];

// 排序函数
dates.sort((a, b) => {
    return a - b;
});

console.log(dates.map(date => date.toISOString()));

这里,Date对象之间可以直接进行减法运算,其结果是两个日期之间相差的毫秒数。同样,比较函数根据这个差值来确定元素的顺序。

3. 对包含时间戳的数组进行排序

如果数组中的元素是时间戳(从1970年1月1日00:00:00 UTC开始到指定时间的毫秒数)。

// 时间戳数组
const timestamps = [1696502400000, 1694774400000, 1699286400000];

// 排序函数
timestamps.sort((a, b) => {
    return a - b;
});

console.log(timestamps.map(timestamp => new Date(timestamp).toISOString()));

时间戳本身就是数字,直接相减就可以得到正确的比较结果,sort方法会根据这个结果对数组进行排序。

4. 对包含日期时间信息的对象数组进行排序

假设数组中的对象包含日期时间信息,例如:

const events = [
    { name: 'Event1', date: '2023-10-05' },
    { name: 'Event2', date: '2023-09-15' },
    { name: 'Event3', date: '2023-11-20' }
];

events.sort((a, b) => {
    return new Date(a.date) - new Date(b.date);
});

console.log(events);

在这个例子中,比较函数从对象中提取日期字符串,将其转换为Date对象后进行比较,从而实现对对象数组的排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949596.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

fail api scope is not declared in the privacy agreement微信小程序uniapp 解决录音无法播放、授权

已解决 fail api scope is not declared in the privacy agreement微信小程序uniapp 解决录音无法播放、授权 没有声明内容协议导致的 微信公众平台&#xff1a;https://mp.weixin.qq.com/【1.左下角的-移动过去后会出现 “帐号设置”】 【2.基本设置->服务内容声明->修…

虚拟机 网络防御(预防信息泄露)

了解VMware网络基本配置 Bridged(桥接模式):虚拟机和主机好比在同一个网络环境下的两台电脑。 NAT(网络地址转换模式):NAT模式虚拟机通过主机进行联网。&#xff08;推荐&#xff09; Host-0nly(主机模式):主机模式将虚拟机与外网隔开&#xff0c;只能让虚拟机和虚拟机之间联…

打包部署若依(RuoYi)SpringBoot后端和Vue前端图文教程

打包后端‘ 1&#xff0c;打开若依&#xff0c;点击右侧的Maven展开Maven管理&#xff0c;选择ruoyi>Lifecycle 先双击clean清除原本启动项目时生成的文件。然后点击package等待项目打包&#xff0c;切记要取消运行再打包 打包完成后会在ruoyi-admin>src>target里面…

矩阵碰一碰发视频源码搭建全解析,支持OEM

在数字化营销与互动体验需求日益增长的当下&#xff0c;矩阵碰一碰发视频功能以其独特的交互性和高效的信息传播能力&#xff0c;正逐渐成为吸引用户、提升品牌影响力的有力工具。本文将深入探讨如何搭建矩阵碰一碰发视频的源码&#xff0c;帮助开发者实现这一创新功能。 一、技…

专题十四——BFS

目录 一BFS解决FloodFill算法 1图像渲染 2岛屿数量 3岛屿的最大面积 4被环绕的区域 二BFS解决蛋源最短路径问题 1迷宫中离入口最近的出口 2最小基因变化 3单词接龙 4为高尔夫比赛砍树 三BFS解决多源最短路径问题 1 01矩阵 2飞地的数量 3地图中的最高点 4地图分…

openwrt 清缓存命令行

一、查看缓存 &#xff1a; free -m 二、清缓存&#xff1a;echo 3 > /proc/sys/vm/drop_caches  三、详解。 释放物理页缓存 echo 1 > /proc/sys/vm/drop_caches 释放可回收的slab对象&#xff0c;包含inode and dentry echo 2 > /proc/sys/vm/drop_caches 同时…

huggingface 下载方法 测试ok

目录 python下载方法&#xff1a; 设置环境变量 ~/.bashrc 缓存目录&#xff0c;默认模型下载目录 安装方法&#xff1a; python 下载无token&#xff1a; python 下载带token 常见报错 登录后创建Read token 2.3 创建token 使用token登录 python下载方法&#xff1…

滑动窗口_⻓度最⼩的⼦数组⽆重复字符的最⻓⼦串将x减到0的最⼩操作数

⻓度最⼩的⼦数组&#xff08;medium https://leetcode.cn/problems/minimum-size-subarray-sum/ 思路一&#xff1a;两个指针&#xff0c;p1 p2同时指向第一个元素。sump2,如果sum<target&#xff0c;p2直到大于&#xff0c;然后记录lenright-left。p1 p2再同时指向第二个…

【无标题】linux

Linux工具快速教程 Linux 基础 Linux工具快速教程1、使用命令帮助1.1 查看命令的简要说明1.2 查看路径 2. 文件及目录2.1 创建和删除2.2 切换目录2.3 列出目录项2.4 查找文件或目录 find2.5 查看文件内容2.6 查找文件内容 好用小工具linux工具电源统计1. 查询公网IPhttp://www.…

HarmonyOS-面试资料

1. HarmonyOS-面试资料 1.1. HarmonyOS 优点、特点 1.1.1. 优点 &#xff08;1&#xff09;在国家方面&#xff0c;是国产的系统&#xff0c;受国家支持不会有限制的情况。   &#xff08;2&#xff09;设备互连18N(1:手机 8&#xff1a;平板、PC、vr设备、可穿戴设备、智慧…

关于物联网的基础知识(一)

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于物联网的基础知识&#xff08;一&a…

基于Thinkphp6+uniapp的陪玩陪聊软件开发方案分析

使用uni-app框架进行前端开发。uni-app是一个使用Vue.js开发所有前端应用的框架&#xff0c;支持一次编写&#xff0c;多端发布&#xff0c;包括APP、小程序、H5等。 使用Thinkphp6框架进行后端开发。Thinkphp6是一个轻量级、高性能、面向对象的PHP开发框架&#xff0c;具有易…

springcloud 介绍

Spring Cloud是一个基于Spring Boot的微服务架构解决方案集合&#xff0c;它提供了一套完整的工具集&#xff0c;用于快速构建分布式系统。在Spring Cloud的架构中&#xff0c;服务被拆分为一系列小型、自治的微服务&#xff0c;每个服务运行在其独立的进程中&#xff0c;并通过…

jenkins入门6 --拉取代码

Jenkins代码拉取 需要的插件&#xff0c;缺少的安装下 新建一个item,选择freestyle project 源码管理配置如下&#xff1a;需要添加git库地址&#xff0c;和登录git的用户密码 配置好后执行编译&#xff0c;成功后拉取的代码在工作空间里

idea全局替换显示不全(ctrl+shift+R)

修改一下idea的配置就行 idea的默认显示条数为100&#xff0c;可以修改成10000

Ubuntu 下测试 NVME SSD 的读写速度

在 Ubuntu 系统下&#xff0c;测试 NVME SSD 的读写速度&#xff0c;有好多种方法&#xff0c;常用的有如下几种&#xff1a; 1. Gnome-disks Gnome-disks&#xff08;也称为“Disks”&#xff09;是 GNOME 桌面环境中的磁盘管理工具&#xff0c;有图形界面&#xff0c;是测试…

AI投资分析:用于股票评级的大型语言模型(LLMs)

“AI in Investment Analysis: LLMs for Equity Stock Ratings” 论文地址&#xff1a;https://arxiv.org/pdf/2411.00856 摘要 投资分析作为金融服务领域的重要组成部分&#xff0c;LLMs&#xff08;大型语言模型&#xff09;为股票评级带来了改进的潜力。传统的股票评级方式…

基于CLIP和DINOv2实现图像相似性方面的比较

概述 在人工智能领域&#xff0c;CLIP和DINOv2是计算机视觉领域的两大巨头。CLIP彻底改变了图像理解&#xff0c;而DINOv2为自监督学习带来了新的方法。 在本文中&#xff0c;我们将踏上一段旅程&#xff0c;揭示定义CLIP和DINOv2的优势和微妙之处。我们的目标是发现这些模型…

【学习笔记】数据结构(十)

内部排序 文章目录 内部排序10.1 概述10.2 插入排序10.2.1 直接插入排序10.2.2 其他插入排序10.2.2.1 折半插入排序(Binary Insertion Sort)10.2.2.2 2-路插入排序&#xff08;Two-Way Insertion Sort&#xff09;10.2.2.3 表插入排序&#xff08;Table Insertion Sort&#xf…

Unity学习笔记(七)使用状态机重构角色攻击

前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 攻击状态重构 首先我们重构攻击状态的动画 之前的动画&#xff0c;我们是使用状态(isAttacking)攻击次数(comboCounter)完成动画的过渡&#xff0c;这样虽然能完成功能&#xff0c;但是如…