精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解

【BUAA】【计组】计算机组成 pre (含详细解析) BUAA 计算机组成 本文章旨在为@走肖暂时无法接通的系列文章创造一个目录,收藏本文章,方便查阅! 1. 入门测试 2. 基础知识 3. Logisim   欢迎来到 Logisim 的世界   Logisim 门电路   Logisim 组合电路   Logisim 时序电路   Logisim 仿真与调试   应用与挑战 4. Verilog 与仿真工具   前言   ISE 入门   VCS 入门   Verilog 语法   Verilog 题目实例与分析   Verilog 工程的设计开发调试 阅读详情

原文:Chalarangelo  译文:IT168

https://github.com/Chalarangelo/30-seconds-of-code#anagrams-of-string-with-duplicates


该项目来自于 Github 用户 Chalarangelo,目前已在 Github 上获得了 5000 多Star,精心收集了多达 48 个有用的 JavaScript 代码片段,该用户的代码可以让程序员在 30 秒甚至更少的时间内理解这些经常用到的基础算法,来看看这些 JavaScript 代码都传达出了什么吧!



Anagrams of string(带有重复项)


使用递归。对于给定字符串中的每个字母,为字母创建字谜。使用map()将字母与每部分字谜组合,然后使用reduce()将所有字谜组合到一个数组中,最基本情况是字符串长度等于2或1。


const anagrams = str => {

  if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str];

  return str.split('').reduce((acc, letter, i) =>

    acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), []);

};

// anagrams('abc') -> ['abc','acb','bac','bca','cab','cba']


数组平均数


使用reduce()将每个值添加到累加器,初始值为0,总和除以数组长度。


const average = arr => arr.reduce((acc, val) => acc + val, 0) / arr.length;

// average([1,2,3]) -> 2


大写每个单词的首字母


使用replace()匹配每个单词的第一个字符,并使用toUpperCase()来将其大写。


const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase());

// capitalizeEveryWord('hello world!') -> 'Hello World!'


首字母大写


使用slice(0,1)和toUpperCase()大写第一个字母,slice(1)获取字符串的其余部分。 省略lowerRest参数以保持字符串的其余部分不变,或将其设置为true以转换为小写。(注意:这和上一个示例不是同一件事情)


const capitalize = (str, lowerRest = false) =>

  str.slice(0, 1).toUpperCase() + (lowerRest ? str.slice(1).toLowerCase() : str.slice(1));

// capitalize('myName', true) -> 'Myname'


检查回文


将字符串转换为toLowerCase(),并使用replace()从中删除非字母的字符。然后,将其转换为tolowerCase(),将('')拆分为单独字符,reverse(),join(''),与原始的非反转字符串进行比较,然后将其转换为tolowerCase()。


const palindrome = str => {

  const s = str.toLowerCase().replace(/[\W_]/g,'');

  return s === s.split('').reverse().join('');

}

// palindrome('taco cat') -> true


计数数组中值的出现次数


每次遇到数组中的特定值时,使用reduce()来递增计数器。


const countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0);

// countOccurrences([1,1,2,1,2,3], 1) -> 3


当前URL


使用window.location.href来获取当前URL。


const currentUrl = _ => window.location.href;

// currentUrl() -> 'https://google.com'


Curry


使用递归。如果提供的参数(args)数量足够,则调用传递函数f,否则返回一个curried函数f。


const curry = (fn, arity = fn.length, ...args) =>

  arity <= args.length

    ? fn(...args)

    : curry.bind(null, fn, arity, ...args);

// curry(Math.pow)(2)(10) -> 1024

// curry(Math.min, 3)(10)(50)(2) -> 2


Deep flatten array


使用递归,使用reduce()来获取所有不是数组的元素,flatten每个元素都是数组。


const deepFlatten = arr =>

  arr.reduce((a, v) => a.concat(Array.isArray(v) ? deepFlatten(v) : v), []);

// deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5]


数组之间的区别


从b创建一个Set,然后在a上使用Array.filter(),只保留b中不包含的值。


const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); };

// difference([1,2,3], [1,2]) -> [3]


两点之间的距离


使用Math.hypot()计算两点之间的欧几里德距离。


const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0);

// distance(1,1, 2,3) -> 2.23606797749979


可以按数字整除


使用模运算符(%)来检查余数是否等于0。


const isDivisible = (dividend, divisor) => dividend % divisor === 0;

// isDivisible(6,3) -> true


转义正则表达式


使用replace()来转义特殊字符。


const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');

// escapeRegExp('(test)') -> \\(test\\)


偶数或奇数


使用Math.abs()将逻辑扩展为负数,使用模(%)运算符进行检查。 如果数字是偶数,则返回true;如果数字是奇数,则返回false。


const isEven = num => num % 2 === 0;

// isEven(3) -> false


阶乘


使用递归。如果n小于或等于1,则返回1。否则返回n和n - 1的阶乘的乘积。


const factorial = n => n <= 1 ? 1 : n * factorial(n - 1);

// factorial(6) -> 720


斐波那契数组生成器


创建一个特定长度的空数组,初始化前两个值(0和1)。使用Array.reduce()向数组中添加值,后面的一个数等于前面两个数相加之和(前两个除外)。


const fibonacci = n =>

  Array(n).fill(0).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []);

// fibonacci(5) -> [0,1,1,2,3]


过滤数组中的非唯一值


将Array.filter()用于仅包含唯一值的数组。


const filterNonUnique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexOf(i));

// filterNonUnique([1,2,2,3,4,4,5]) -> [1,3,5]


Flatten数组


使用reduce()来获取数组中的所有元素,并使用concat()来使它们flatten。


const flatten = arr => arr.reduce((a, v) => a.concat(v), []);

// flatten([1,[2],3,4]) -> [1,2,3,4]


从数组中获取最大值


使用Math.max()与spread运算符(...)结合得到数组中的最大值。


const arrayMax = arr => Math.max(...arr);

// arrayMax([10, 1, 5]) -> 10


从数组中获取最小值


使用Math.min()与spread运算符(...)结合得到数组中的最小值。


const arrayMin = arr => Math.min(...arr);

// arrayMin([10, 1, 5]) -> 1


获取滚动位置


如果已定义,请使用pageXOffset和pageYOffset,否则使用scrollLeft和scrollTop,可以省略el来使用window的默认值。


const getScrollPos = (el = window) =>

  ({x: (el.pageXOffset !== undefined) ? el.pageXOffset : el.scrollLeft,

    y: (el.pageYOffset !== undefined) ? el.pageYOffset : el.scrollTop});

// getScrollPos() -> {x: 0, y: 200}


最大公约数(GCD)


使用递归。基本情况是当y等于0时。在这种情况下,返回x。否则,返回y的GCD和x / y的其余部分。


const gcd = (x, y) => !y ? x : gcd(y, x % y);

// gcd (8, 36) -> 4


Head of list


返回ARR[0]


const head = arr => arr[0];

// head([1,2,3]) -> 1


list初始化


返回arr.slice(0,-1)



const initial = arr => arr.slice(0, -1);

// initial([1,2,3]) -> [1,2]


用range初始化数组


使用Array(end-start)创建所需长度的数组,使用map()来填充范围中的所需值,可以省略start使用默认值0。


const initializeArrayRange = (end, start = 0) =>

  Array.apply(null, Array(end - start)).map((v, i) => i + start);

// initializeArrayRange(5) -> [0,1,2,3,4]


用值初始化数组


使用Array(n)创建所需长度的数组,fill(v)以填充所需的值,可以忽略value使用默认值0。


const initializeArray = (n, value = 0) => Array(n).fill(value);

// initializeArray(5, 2) -> [2,2,2,2,2]


列表的最后


返回arr.slice(-1)[0]


const last = arr => arr.slice(-1)[0];

// last([1,2,3]) -> 3


测试功能所花费的时间


使用performance.now()获取函数的开始和结束时间,console.log()所花费的时间。第一个参数是函数名,随后的参数传递给函数。


const timeTaken = callback => {

  console.time('timeTaken');

  const r = callback();

  console.timeEnd('timeTaken');

  return r;

};

// timeTaken(() => Math.pow(2, 10)) -> 1024

// (logged): timeTaken: 0.02099609375ms


来自键值对的对象


使用Array.reduce()来创建和组合键值对。


const objectFromPairs = arr => arr.reduce((a, v) => (a[v[0]] = v[1], a), {});

// objectFromPairs([['a',1],['b',2]]) -> {a: 1, b: 2}


管道


使用Array.reduce()通过函数传递值。


const pipe = (...funcs) => arg => funcs.reduce((acc, func) => func(acc), arg);

// pipe(btoa, x => x.toUpperCase())("Test") -> "VGVZDA=="


Powerset


使用reduce()与map()结合来遍历元素,并将其组合成包含所有组合的数组。


const powerset = arr =>

  arr.reduce((a, v) => a.concat(a.map(r => [v].concat(r))), [[]]);

// powerset([1,2]) -> [[], [1], [2], [2,1]]


范围内的随机整数


使用Math.random()生成一个随机数并将其映射到所需的范围,使用Math.floor()使其成为一个整数。


const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;

// randomIntegerInRange(0, 5) -> 2


范围内的随机数


使用Math.random()生成一个随机值,使用乘法将其映射到所需的范围。


const randomInRange = (min, max) => Math.random() * (max - min) + min;

// randomInRange(2,10) -> 6.0211363285087005


随机化数组的顺序


使用sort()重新排序元素,利用Math.random()来随机排序。


const shuffle = arr => arr.sort(() => Math.random() - 0.5);

// shuffle([1,2,3]) -> [2,3,1]


重定向到URL


使用window.location.href或window.location.replace()重定向到url。 传递第二个参数来模拟链接点击(true - default)或HTTP重定向(false)。


const redirect = (url, asLink = true) =>

  asLink ? window.location.href = url : window.location.replace(url);

// redirect('https://google.com')


反转一个字符串


使用数组解构和Array.reverse()来颠倒字符串中的字符顺序。合并字符以使用join('')获取字符串。


const reverseString = str => [...str].reverse().join('');

// reverseString('foobar') -> 'raboof'


RGB到十六进制


使用按位左移运算符(<<)和toString(16),然后padStart(6,“0”)将给定的RGB参数转换为十六进制字符串以获得6位十六进制值。


const rgbToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0');

// rgbToHex(255, 165, 1) -> 'ffa501'


滚动到顶部


使用document.documentElement.scrollTop或document.body.scrollTop获取到顶部的距离。

从顶部滚动一小部分距离。


使用window.requestAnimationFrame()来滚动。


const scrollToTop = _ => {

  const c = document.documentElement.scrollTop || document.body.scrollTop;

  if (c > 0) {

    window.requestAnimationFrame(scrollToTop);

    window.scrollTo(0, c - c / 8);

  }

};

// scrollToTop()


随机数组值


使用Array.map()和Math.random()创建一个随机值的数组。使用Array.sort()根据随机值对原始数组的元素进行排序。



数组之间的相似性


使用filter()移除不是values的一部分值,使用includes()确定。


const similarity = (arr, values) => arr.filter(v => values.includes(v));

// similarity([1,2,3], [1,2,4]) -> [1,2]


按字符串排序(按字母顺序排列)


使用split('')分割字符串,sort()使用localeCompare(),使用join('')重新组合。


const sortCharactersInString = str =>

  str.split('').sort((a, b) => a.localeCompare(b)).join('');

// sortCharactersInString('cabbage') -> 'aabbceg'


数组总和


使用reduce()将每个值添加到累加器,初始化值为0。


const sum = arr => arr.reduce((acc, val) => acc + val, 0);

// sum([1,2,3,4]) -> 10


交换两个变量的值


使用数组解构来交换两个变量之间的值。


[varA, varB] = [varB, varA];

// [x, y] = [y, x]


列表的tail


返回arr.slice(1)


const tail = arr => arr.length > 1 ? arr.slice(1) : arr;

// tail([1,2,3]) -> [2,3]

// tail([1]) -> [1]


数组唯一值


使用ES6 Set和... rest操作符去掉所有重复值。


const unique = arr => [...new Set(arr)];

// unique([1,2,2,3,4,4,5]) -> [1,2,3,4,5]


URL参数


使用match() 与适当的正则表达式来获得所有键值对,适当的map() 。使用Object.assign()和spread运算符(...)将所有键值对组合到一个对象中,将location.search作为参数传递给当前url。


const getUrlParameters = url =>

  url.match(/([^?=&]+)(=([^&]*))/g).reduce(

    (a, v) => (a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1), a), {}

  );

// getUrlParameters('http://url.com/page?name=Adam&surname=Smith') -> {name: 'Adam', surname: 'Smith'}


UUID生成器


使用crypto API生成符合RFC4122版本4的UUID。


const uuid = _ =>

  ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>

    (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)

  );

// uuid() -> '7982fcfe-5721-4632-bede-6000885be57d'


验证数字


使用!isNaN和parseFloat()来检查参数是否是一个数字,使用isFinite()来检查数字是否是有限的。


const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n;

// validateNumber('10') -> true


翻译多有不准确之处,感兴趣的程序员可以自行到Github上查看英文原版。

从报错到定位:Memtest86 DQ位算法解析与实践指南 本文深入解析了Memtest86内存测试工具报错信息的解读方法,重点介绍了通过地址解析、数据转换、位比对和DQ定位四步算法,精准锁定故障DQ位的实践流程。文章以DDR4和DDR5为例,详细拆解了从十六进制报错到二进制比对的完整步骤,并提供了从单个报错分析到故障模式诊断的进阶指南,帮助用户将抽象的报错信息转化为具体的维修或排查依据。 阅读详情

相关推荐

避开期货指标常见坑:文华财经赢顺DK多空指标优化配置指南(附参数调试技巧)

本文详细解析了文华财经赢顺DK多空指标的优化配置方法,帮助交易者避开常见使用误区。通过参数个性化适配、动态调整趋势阈值和过滤假信号的三重验证,提升指标在期货交易中的准确性。附有参数调试技巧和不同市况下的配置建议,适合中高级交易者参考。

weixin_29063979的博客 434

javascript filter 详解及应用

filter() 简单讲filter就是一个数组过滤器,参数接收一个函数,数组的每一项经过函数过滤,返回一个符合过滤条件的新数组 函数接收三个参数: item (当前遍历的数组项) i (当前项索引) arr (调用filter数组本身) // 需求找到数组内偶数 let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ...

weixin_33972649的博客 374

FPGA新手必看:XC7Z020最小系统搭建全攻略(附原理图解析)

本文为FPGA新手提供了XC7Z020最小系统搭建的完整实战指南。文章详细解析了电源架构、时钟复位、配置调试等关键硬件电路设计,并重点剖析了外围电路与端口引脚的连接要点及常见陷阱,帮助读者从零开始构建稳定可靠的开发平台。

weixin_29189377的博客 359

es6 find()与filter()区别

find 和 filter 都是不改变原数组的方法 find()函数用来查找目标元素,找到就返回该元素,找不到返回undefined。返回的是对象 如遇到重复的值只会返回第一次出现的值  var users = [ { name:"alie" }, { name:"carrie" },{ name:"carri...

周家大小姐 1370

Openwork 入门指南:开源 AI 桌面助手快速上手

Openwork是一款开源的AI桌面代理工具,提供类似Claude Cowork的免费替代方案。它支持本地运行,确保隐私安全,并能高效处理文件整理、文档读写等任务。支持多种AI模型,通过MIT许可完全免费。安装简单,仅需运行命令行或下载桌面版,需配置API Key后即可使用。操作直观,支持多步骤规划和权限控制,适合自动化重复工作。目前主要支持macOS,未来将扩展至Windows/Linux。建议从简单任务入手,逐步掌握这一高效的数字助手工具。

3802

【TM1650】STM8S TM1650芯片控制程序

以下为.h文件: #ifndef __TM1650_I2C_H #define __TM1650_I2C_H #include "stm8s.h" #include "stm8s_gpio.h" #include "tim1.h" #include "usart2.h" #include &lt;iostm8s103f3.h&gt; #include &lt;intrinsics....

cxw312864660的博客 1万+

Github分享:仅需30秒就可理解的48个JavaScript代码片段!

该项目来自于Github用户Chalarangelo(文末有项目完整地址,原版为英文),目前已在Github上获得了3000多Star,精心收集了多达48个有用的JavaScript代码片段,该用户的代码可以让程序员在30秒甚至更少的时间内理解这些经常用到的基础算法,来看看这些JavaScript代码都传达出了什么吧!Anagrams of string(带有重复项)使用递归。对于给定字符串中的每...

weixin_34112208的博客 496

告别ROS1!在Ubuntu 22.04上为VINS-Fusion适配ROS2 Humble的完整踩坑记录

本文详细记录了在Ubuntu 22.04上将VINS-Fusion从ROS1迁移到ROS2 Humble的完整过程,包括环境搭建、依赖管理、核心代码适配及性能优化。通过实战案例和调试技巧,帮助开发者高效解决迁移过程中的常见问题,提升系统稳定性和性能。

weixin_42628688的博客 280

filter()方法

定义: 1、filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素; 2、filter() 不会对空数组进行检测; 3、filter() 不会改变原始数组。 语法: array.filter(function(currentValue,index,arr), thisValue) 参数说明: 例: let arr = [2, 3,...

mm 3911

Nmap源码分析(端口扫描)

端口扫描是Nmap的核心功能,用于确定目标机的端口状态(开放、关闭、过滤等),也为Nmap的服务与版本扫描、OS扫描、脚本扫描提供基本的指引信息。所以,深入理解端口扫描的实现对分析其他的扫描方式很有帮助。 1简单回顾   首先简要回顾一下端口扫描的原理以及命令行选项。 1.1扫描原理   Nmap提供的10多种类型的端口扫描方法,如TCP SYN/ACK/FIN/Xmas/NULL/ Windows/Connect,FTP Bounce, Idle scan, UDP port u...

墨痕诉清风的博客 1597

Codex 接入国产大模型指南:客户端与 CLI 双端实战

CC Switch是目前最流行的 Codex / Claude Code 模型切换工具,内置了协议转换功能,支持几乎所有主流国产模型。核心原理Codex → 本地 8317 端口(CC Switch)→ 协议转换 → 国产模型 API整个过程对 Codex 完全透明,Codex 以为自己在跟标准的 Responses API 对话。用户类型推荐方案理由新手 / 不想折腾配置简单,免费额度够用追求稳定体验通义千问(原生接入)官方兼容,功能最完整企业用户自建 AI 网关可控性强,支持多用户管理预算有限。

篮球界最会写bug的人;程序猿中打球最菜的人。 575

find()和filter()的区别

【代码】find()和filter()的区别。

weixin_44134816的博客 190

19、情境理论中的信息结构解析

本文系统解析了情境理论中的信息结构,从信息元(infon)的基本概念出发,深入探讨了关系结构与简单信息结构的构建方法,分析了标准信息结构所满足的一系列公理(如A1-A14),并阐述了角色、同一性、高阶信息、循环现象、参数适当性及信息元部分性等核心性质。通过具体示例和流程图展示了信息结构的构建过程,并对比了不同公理下的结构差异,最后讨论了该理论在与其他领域融合中的发展趋势及面临的挑战。

book8的博客 78

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解!

原文:https://github.com/Chalarangelo/30-seconds-of-code#anagrams-of-string-with-duplicates 作者:Chalarangelo 译者:IT168 www.toutiao.com/i6498962961288135182 该项目来自于 Github 用户 Chalarangelo,目前已在 Gi...

adai19850204的博客 98

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

精心收集的48个JavaScript代码片段,仅需30秒就可理解

源文链接 :https://github.com/Chalarangelo/30-seconds-of-code#anagrams-of-string-with-duplicates 该项目来自于 Github 用户 Chalarangelo,目前已在 Github 上获得了 5000 多Star,精心收集了多达 48 个有用的 JavaScript 代码片段,该用户的代码可以让程序员在 30 秒...

黑客与画家 337

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

精心收集的48个JavaScript代码片段,仅需30秒就可理解!

往期精选●架构师高并发高性能分布式教程(3000G) ● 39阶段精品云计算大数据实战视频教程● 互联网技术干货视频教程大全【菜单为准】● 2017年8月最新In...

公众号-老炮说Java 281

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解!(转载)

Anagrams of string(带有重复项) 使用递归。对于给定字符串中的每个字母,为字母创建字谜。使用map()将字母与每部分字谜组合,然后使用reduce()将所有字谜组合到一个数组中,最基本情况是字符串长度等于2或1。 const anagrams = str => { if (str.length <= 2) return str.length =...

Peter0427的博客 169
上一篇: JavaScript单线程之同步任务与异步任务
下一篇: 这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已
! 不再维护
博客等级 码龄11年 63粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值