检查数组所有元素是否满足给定条件

如果提供的函数对数组的所有元素返回 true,则返回 true,否则返回 false

思路

实现思路如下:

使用数组的filter方法对数组执行给定的函数,然后使用count方法获取执行后的结果,再和count方法获取未执行filter方法的结果进行比较。

代码实现

下面我们来看php和js以及ts代码的实现:

php代码实现
function all($arr,$fn){return count(array_filter($arr,$fn)) === count($arr);
}
使用示例
all([2, 3, 4, 5], function ($item) {return $item > 1;
}); // true
js代码实现
const all = (arr,fn) => arr.filter(fn).length === arr.length;
ts代码实现
const all = <T,U>(arr:T[], fn: (value: T, index: number, array: T[]) => U) => arr.filter(fn).length === arr.length;
使用示例
all([2,3,4,5],n => n > 1); // true

总结

与js/ts实现不同点如下:

  1. php通过count方法来获取数组的长度,而js/ts则可以直接通过length来获取数组的长度。
  2. php的filter方法名叫array_filter,而js/ts则是叫filter

检查数组所有元素是否有一项满足给定条件

如果提供的函数对数组的至少一个元素返回 true,则返回 true,否则返回 false

实现思路

实现思路和前面的all函数很相似,只不过这里不需要做比较,只需要判断长度大于0即可。

代码实现

下面我们来看php和js以及ts代码的实现:

php代码实现
function any($arr,$fn){return count(array_filter($arr,$fn)) > 0;
}
使用示例
any([2, 3, 4, 5], function ($item) {return $item < 3;
}); // true
js代码实现
const any = (arr,fn) => arr.filter(fn).length > 0;
ts代码实现
const any = <T,U>(arr:T[], fn: (value: T, index: number, array: T[]) => U) => arr.filter(fn).length > 0;
使用示例
any([2,3,4,5],n => n < 3); // true

总结

与all的总结一致。

检查 2 个数字是否大致相等

检查两个数字是否大致相等。

实现思路

实现思路如下:

该函数有3个参数,通过abs方法计算前面2个参数的绝对差值,然后与第三个参数进行比较,判断是否小于第三个参数,第三个参数默认值是0.001。

代码实现

下面我们来看php和js以及ts代码的实现:

php代码实现
function apprEqual($a,$b,$c = 0.001){return abs($a - $b) < $c;
}
使用示例
apprEqual(10.0, 10.00001); // true
apprEqual(10.0, 10.01); // false
js代码实现
const apprEqual = (a,b,c = 0.001) => Math.abs(a - b) < c;
ts代码实现
const apprEqual = (a: number,b:number,c = 0.001) => Math.abs(a - b) < c;
使用示例
apprEqual(10.0, 10.00001); // true
apprEqual(10.0, 10.01); // false

总结

与js/ts实现不同点如下:

  1. php的获取绝对值的方法名叫abs,而js/ts则是从Math对象中获取,即Math.abs

平均值

返回两个或多个数字的平均值。

实现思路

实现思路如下:

使用sum函数求和,然后除以长度count即可,参数可以使用展开运算符来组成一个数组,注意需要写一个三元表达式,判断长度是否为0。

代码实现

下面我们来看php和js以及ts代码的实现:

php代码实现
function average(...$arr){$len = count($arr);return $len === 0 ? 0 : array_sum($arr) / $len;
}
使用示例
average(1, 2, 3); // 2
js代码实现
const average = (...arr) => {const len = arr.length;return len === 0 ? 0 : arr.reduce((r,i) => r += i,0) / len;
}
ts代码实现
const average = (...arr: number[]):number => {const len = arr.length;return len === 0 ? 0 : arr.reduce((r,i) => r += i,0) / len;
}
使用示例
average(1, 2, 3); // 2

总结

与js/ts实现不同点如下:

  1. php可以直接使用array_sum方法求数字数组的和,js/ts需要循环自己计算(或者自己实现一个sum方法)。

数值限定

将数值限制在边界值 a 和 b 指定的包含范围内。

实现思路

实现思路如下:

如果该数值在范围内,则返回该数值,否则,使用最小值方法和最大值方法返回范围内最接近的数字。

代码实现

下面我们来看php和js以及ts代码的实现:

php代码实现
function clampNumber($num,$a,$b){return max(min($num,max($a,$b)),min($a,$b));
}
使用示例
clampNumber(2, 3, 5); // 3 
clampNumber(1, -1, -5); // -1
js代码实现
const clampNumber = (num,a,b) => {const max = Math.max,min = Math.min;return max(min(num,max(a,b)),min(a,b));
}
ts代码实现
const clampNumber = (num:number,a:number,b:number) => {const max = Math.max,min = Math.min;return max(min(num,max(a,b)),min(a,b));
}
使用示例
clampNumber(2, 3, 5); // 3 
clampNumber(1, -1, -5); // -1

总结

与js/ts实现不同点如下:

  1. php的获取最小值和最大值的方法名叫minmax,而js/ts则是从Math对象中获取,即Math.minMath.max

组合函数

返回一个将多个函数组合成单个可调用函数的新函数。

实现思路

实现思路如下:

使用 array_reduce() 执行从右到左的函数组合。该函数接收3个参数,第一个参数为函数列表,第二个参数是一个回调函数用来合并数组中的每一个函数,第三个参数是函数的初始值,即$function($x){ return $x; },默认是一个恒等函数,也就是一个返回其输入参数本身的函数。

代码实现

下面我们来看php和js以及ts代码的实现:

php代码实现
function compose(...$fns){return array_reduce($fns,function ($carry,$fn){// 使用 use语句导入闭包中的变量$carry,$fnreturn function($x) use ($carry,$fn){return $carry($fn($x));}},$function($x){return $x;})
}
使用示例
$compose = compose(// 加2function ($x) {return $x + 2;},// 乘以4function ($x) {return $x * 4;}
);
$compose(3); // 20
js代码实现
const compose = (...fns) => fns.reduce((f,h) => (...args) => f(h(...args)));
ts代码实现
type ComposeFn<T extends any> = (...args: T[]) => T;const compose = <T,U extends ComposeFn<T>[]>(...fns: U) =>fns.reduce((f, h) =>(...args: Parameters<ComposeFn<T>>) => f(h(...args)));
使用示例
const add5 = x => x + 5;
const multiply = (x, y) => x * y;
const multiplyAndAdd5 = compose(add5, multiply);
const res = multiplyAndAdd5(5, 2); // 15

总结

与js/ts实现不同点如下:

  1. php需要使用use语句来导入闭包中的变量,而js/ts则不需要。
  2. php使用array_reduce方法来遍历函数数组,并且需要提供一个恒等函数作为第三个参数的初始值,而js/ts直接调用数组的reduce方法来遍历函数数组,并且不需要提供第三个作为初始值的参数。

统计字符串中元音字母的数量

返回所提供字符串中的元音字母数量。

实现思路

实现思路如下:

使用正则表达式来匹配元音字母,元音字母包含a、e、i、o、u等字母。调用php的preg_match_all方法来匹配,然后使用count方法计算返回值的长度,即为元音字母的数量。

代码实现

下面我们来看php和js以及ts代码的实现:

php代码实现
function countVowels($str){preg_match_all('/[aeiou]/i',$str,$matches);// $matches为匹配结果return count($matches[0]);
}
使用示例
countVowels('sampleInput'); // 4
js代码实现
const countVowels = (str) => [...str.matchAll(/[aeiou]/ig)].length;
ts代码实现
const countVowels = (str: string) => [...str.matchAll(/[aeiou]/ig)].length;
使用示例
countVowels('sampleInput'); // 4

总结

与js/ts实现不同点如下:

  1. php使用preg_match_all方法来匹配字符串所有符合条件的字符,而js/ts则使用String.matchAll方法。
  2. php 定义正则表达式和js/ts有所区别,需要把正则表达式当作一个字符串。
  3. js/ts调用matchAll方法时需要提供一个g修饰符,表示用来匹配全局,php则不需要。
  4. js/ts调用matchAll方法返回的是一个迭代器,需要使用展开运算符转换成数组,然后再计算长度。
  5. php使用count方法来获取数组的长度,而js/ts可以直接通过length属性来获取。

柯里化函数

对函数进行柯里化,以便在多次调用中获取参数。

实现思路

实现思路如下:

  1. curry接收一个函数参数,返回执行的累积器$acc
  2. 使用&操作符引用累积器,使用use语句导入函数和累积器。
  3. 使用array_merge方法合并所有参数。
  4. 使用php反射ReflectionFunction获取函数所需参数数量,然后调用getNumberOfRequiredParameters方法获取必需参数的数量。
  5. 如果必需参数数量小于等于外部参数数量,则直接返回函数执行参数结果,否则递归的执行累积器。

代码实现

下面我们来看php和js以及ts代码的实现:

php代码实现
function curry($fn){$acc = function ($arg) use ($fn,&$acc){return function (...$args) use($fn,$arg,$acc){// 合并参数$arg = array_merge($args);// 创建一个反射$ref = new ReflectionFunction($fn);// 通过反射获取必需参数$totalArgs = $ref -> getNumberOfRequiredParameters();if($totalArgs <= count($arg)){return $fn(...$arg);}return $acc($arg);}}return $acc([]);
}
使用示例
$curriedAdd = curry(function ($a, $b) { return $a + $b; }); 
$add10 = $curriedAdd(10); 
var_dump($add10(15)); // 25
js代码实现
const curry = fn => (...args) => args.length >= fn.length ? fn(...args) : (...nArgs) => curry(fn)(...args,...nArgs);
ts代码实现
const curry =<T, R, F extends (...args: T[]) => R>(fn: F) =>(...args: T[]) =>args.length >= fn.length? fn(...args): (...nArgs: T[]) => curry(fn as (...args: unknown[]) => unknown)(...args, ...nArgs);
使用示例
const curriedAdd = curry((a,b) => a + b); 
const add10 = curriedAdd(10); 
const res = add10(15); // 25

总结

与js/ts实现不同点如下:

  1. php中使用了反射相关方法来获取参数,而js/ts则不需要。
  2. php使用array_merge方法来合并参数,而js/ts则不需要。
  3. 两者的判断逻辑也有差异。

ps: 两者的实现都采用了递归的方式,这点需要注意。

取消字符串首字母大写

取消字符串首字母的大写。

实现思路

实现思路如下:

调用lcfirst方法可以直接将字符串大写首字母转换成小写,根据第二个参数$upperRest来决定是否将其余字母转换成大写,使用strtoupper方法即可。

代码实现

下面我们来看php和js以及ts代码的实现:

php代码实现
function decapitalize($str,$upperRest = false){return lcfirst($upperRest ? strtoupper($str) : $str);
}
使用示例
decapitalize('FooBar'); // 'fooBar'
js代码实现
const decapitalize = (str, upperRest = false) => str.slice(0,1).toLowerCase() + `${upperRest ? str.slice(1).toUpperCase() : str.slice(1)}`;
ts代码实现
const decapitalize = (str: string, upperRest = false) => str.slice(0,1).toLowerCase() + `${upperRest ? str.slice(1).toUpperCase() : str.slice(1)}`;
使用示例
decapitalize('FooBar'); // 'fooBar'

总结

与js/ts实现不同点如下:

  1. php有方法可以直接将首字母转换成小写,而js/ts则需要通过slice(或其它字符串的截取方法,例如:substr)方法来截取字符串,然后拼接在一起。
  2. php转换成大写的方法是strtoupper,而js/ts则是通过调用String.toUpperCase方法来转换成大写。

深度展开数组

深度展平数组,直接将多维数组转成一维数组。

实现思路

实现思路如下:

使用foreach循环数组,如果数组项是数组(使用is_array方法来判断),则使用递归加array_push和空数组以及展开运算符来合并数组,否则直接使用[]语法来添加数组项(相当于array_push方法)。

代码实现

下面我们来看php和js以及ts代码的实现:

php代码实现
function deepFlatten($items){$res = [];foreach($item as $items){if(is_array($item)){array_push($res,...deepFlatten($item));}else{$res[] = $item;}}return $res;
}
使用示例
deepFlatten([1, [2], [[3], 4], 5]); // [1, 2, 3, 4, 5]
js代码实现
const deepFlatten = (items) => {let res = [];for(const item of items){if(Array.isArray(item) && item.length > 0){res.push(...deepFlatten(item))}else{res.push(item)}}return res;
}
ts代码实现
const deepFlatten = <T>(items: T[]) => {let res: T[] = [];for (const item of items) {if (Array.isArray(item) && item.length > 0) {res.push(...deepFlatten(item));} else {res.push(item);}}return res;
};
使用示例
deepFlatten([1, [2], [[3], 4], 5]); // [1, 2, 3, 4, 5]

总结

与js/ts实现不同点如下:

  1. php使用array_push方法来往数组末尾添加元素,而js/ts则是直接使用push方法。
  2. php可以使用[]语法来代替array_push方法,js/ts没有相关语法。
  3. php使用is_array方法来判断是否是数组,而js/ts则使用Array.isArray方法。
  4. php使用foreach循环遍历数组,js/ts没有foreach循环,但可以使用for循环代替。

行业拓展

分享一个面向研发人群使用的前后端分离的低代码软件——JNPF。

基于 Java Boot/.Net Core双引擎,它适配国产化,支持主流数据库和操作系统,提供五十几种高频预制组件,内置了常用的后台管理系统使用场景和实用模版,通过简单的拖拉拽操作,开发者能够高效完成软件开发,提高开发效率,减少代码编写工作。

JNPF基于SpringBoot+Vue.js,提供了一个适合所有水平用户的低代码学习平台,无论是有经验的开发者还是编程新手,都可以在这里找到适合自己的学习路径。

此外,JNPF支持全源码交付,完全支持根据公司、项目需求、业务需求进行二次改造开发或内网部署,具备多角色门户、登录认证、组织管理、角色授权、表单设计、流程设计、页面配置、报表设计、门户配置、代码生成工具等开箱即用的在线服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/911876.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/911876.shtml
英文地址,请注明出处:http://en.pswp.cn/news/911876.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HuggingFace下载的模型缓存到了C盘,如何安全迁移到其他盘

HuggingFace下载的模型缓存到了C盘&#xff0c;如何安全迁移到其他盘 ✅ 方法一&#xff1a;通过环境变量永久迁移缓存目录&#xff08;**推荐**&#xff09;步骤如下&#xff1a;1️⃣ 在 D 盘创建一个目录&#xff08;比如&#xff09;&#xff1a;2️⃣ 设置环境变量&#x…

vue 开启 source-map 后构建速度会很慢

vue.config.js 的 configureWebpack.devtool 设置为 source-map 后&#xff0c;编译速度会变慢&#xff0c;严重影响开发进度。 改善方法&#xff1a; 一&#xff1a;改为 module-eval-source-map 改为 module-eval-source-map 在打包速度和源码信息还原程度都属于良好程度。…

三维空间数据格式全景图:OSGB | 3Dtiles | I3S | S3M

前言 当城市数字孪生遇上国产化替代&#xff0c;开发者该如何选型&#xff1f; ——深入解析四大主流格式的技术基因与落地场景 &#x1f52e; 趋势预言&#xff1a; 2025年国土空间规划全面实景三维化 ▶ S3M市占率将突破60%Cesium开源生态持续领跑Web端 ▶ 3Dtiles仍是跨国项…

【服务器】服务器选型设计

一、服务器产品说明 1.1 基础服务器说明 1.1.1、服务器产品分类与核心指标​​ ​​1. 通用分类体系​​ ​​类型​​ ​​适用场景​​ ​​代表产品指标​​ 塔式服务器 中小企业应用 ≤2路CPU&#xff0c;32G内存&#xff0c;支持热插拔HDD 机架服务器 数据中心主…

【C++】noexcept的作用

【C】noexcept的作用 noexcept是C11引入的关键字&#xff0c;用于指定函数是否会抛出异常。它既是一个修饰符也是一个操作符&#xff0c;在现代C编程中扮演着重要角色。 一、noexcept的基本概念 noexcept主要有两种形式&#xff1a; 无条件形式​&#xff1a;void func() n…

Docker 到底是个什么?

Docker 技术全面解析&#xff1a;从安装到应用 一、引言 在当今的软件开发和运维领域&#xff0c;Docker 已经成为了一个不可或缺的工具。它以其轻量级、可移植性和高效性等特点&#xff0c;改变了开发者和运维人员的工作方式&#xff0c;使得应用的打包、分发、运行变得更加…

Python 可迭代的对象、迭代器 和生成器(Sentence类第3版:生成器函数)

Sentence类第3版&#xff1a;生成器函数 实现相同功能&#xff0c;但却符合 Python 习惯的方式是&#xff0c;用生成器函数代替 SentenceIterator 类。先看示例 14-5&#xff0c;然后详细说明生成器函数。 示例 14-5 sentence_gen.py&#xff1a;使用生成器函数实现 Sentence…

5G自协商

好的&#xff0c;下面是一个基于裸机 C 环境的自协商实现示例代码&#xff0c;支持 **最高 5G 并向下兼容**。这个代码框架假设你使用的是 IEEE 802.3 规范下的 **MDIO** 接口和常见的 **Marvell PHY**&#xff08;或类似支持 5G/2.5G 的PHY&#xff09;。 c #include <std…

sublime 4200 激活

目录 下载激活方式一&#xff1a;sublime 打开方式二&#xff1a;https://hexed.it 打开 下载 sublime官方下载 sublime_text_build_4200_x64.zip 激活 方式一&#xff1a;sublime 打开 1、复制 sublime_text.exe 为 sublime_text_activation.exe 2、直接使用 sublime_ 打开…

Ceph 和 MinIO

Ceph 和 MinIO 是两种主流的分布式存储系统&#xff0c;但它们的设计目标、架构和使用场景存在显著差异。以下是清晰的对比解析&#xff1a; &#x1f9e9; 核心定位对比 维度CephMinIO定位统一存储平台&#xff08;块/对象/文件&#xff09;纯对象存储&#xff08;S3兼容&…

cili3d笔记20 正交投影3d重建笔记1

正交视图转3d mostFrequentCluster.lines.forEach(line > {const [x1, y1, x2, y2] line;let xhat{x1,x2};let yhat{y1,y2};}); 没考虑到侧视图 const clusters clusterLines(inputlines, 5);const lines3d:[number,number,number,number,number,number][][]const { mostM…

【Docker基础】Docker容器生命周期管理:从创建到删除的完整指南

目录 1 容器生命周期概述 2 容器创建&#xff08;docker create&#xff09; 2.1 docker create命令详解 2.2 创建流程解析 2.3 创建与运行的区别 3 容器启动&#xff08;docker start&#xff09; 3.1 docker start命令详解 3.2 启动流程解析 3.3 启动与运行的区别 …

Docker、Docker composer与Docker desktop

文章目录 Docker、Docker composer与Docker desktop一、docker、docker composer、docker desktop1.1 Docker1.2 Docker Compose1.3 Docker Desktop1.4 三者之间的区别 二、docker desktop的安装和换源2.1 前期准备WSL2 2.1 Docker Desktop 安装下载 Docker Desktop安装 Docker…

H5录音、图文视频IndexDB储存最佳实践:用AI生成语音备忘录

引言 早在大学的时候&#xff0c;我就期望做一款属于自己的 APP&#xff0c;可惜那时不懂技术。现在有了技术&#xff0c;但却没有时间。好在 AI 的快速发展终于让我完成了这个愿望。于是&#xff0c;我用半天的时间&#xff0c;用 AI 生成了一个纯前端的 H5 程序&#xff1a;…

简述C++ nlohmann/json 库

目录 JSON概述 nlohmann/json 库的使用 创建json数组/对象 字符串解析&#xff08;parse反序列化&#xff09; 数据访问 序列化 文件读写 JSON概述 JSON(JavaScrip Object Notation)是一种轻量级、跨语言的数据交换格式。它基于 ECMAScript 子集&#xff0c;以独立于编程…

定制开发开源AI智能名片与S2B2C商城小程序的内容分发体系构建:基于“1+N“素材复用模型的创新实践

摘要&#xff1a;在数字内容爆炸式增长的当下&#xff0c;本文针对内容分发效率低下的行业痛点&#xff0c;提出基于"定制开发开源AI智能名片S2B2C商城小程序"的一体化解决方案。通过构建"1篇长文10条长视频20条短视频10个平台"的素材复用公式&#xff0c;…

c++26新功能—hive容器

一、容器的演进 科学进步的过程一般来说都是从先解决常用的、迫切的问题开始&#xff0c;然后再逐步解决一些少见不迫切的问题&#xff0c;直到最终解决到认知程度内的诸多问题。举一个网上的例子&#xff0c;以前说咱们无法生产水笔的尖头上的钢球&#xff0c;其实这对于国内…

Kafka 源码剖析:消息存储与协议实现(二)

四、协议实现机制探秘 4.1 生产者协议 4.1.1 消息发送流程 Producer 在向 Kafka 集群发送消息时&#xff0c;首先会根据分区策略选择目标分区 。常见的分区策略有轮询、按消息键的哈希值分区以及自定义分区策略 。如果生产者在发送消息时指定了分区号&#xff0c;那么消息就…

Vue.js 与 TypeScript:最佳实践

1. 引言 Vue.js 是一个渐进式、灵活的 JavaScript 框架&#xff0c;广泛用于构建用户界面和单页应用&#xff08;SPA&#xff09;。而 TypeScript 是 JavaScript 的一个超集&#xff0c;添加了静态类型和其他高级特性。将两者结合使用&#xff0c;可以帮助开发者构建更具可维护…

webpack5 css-loader:从基础到原理

webpack 处理样式 webpack本身是不能识别样式资源的&#xff0c;需要借助Loader来帮助webpack解析样式资源&#xff0c;样式资源包括但不限于css/less/sass/scss/styl 未使用样式处理加载器前 运行webpack打包命令 bash npx webpack报错信息如图&#xff0c;提示无法识别css…